簡體   English   中英

可變集+ = Scala中的返回值

[英]Mutable Set += return value in Scala

據我所知,在可變集上有一個+=方法就是這樣

val s = collection.mutable.Set(1)
s += 2  // s is now a mutable Set(1, 2)

有類似的效果

var s = Set(1) // immutable
s += 2  // s is now an immutable Set(1, 2)

如果是這樣,為什么可變Set上的+=方法返回Set本身? 這不會使代碼更難以重構,例如

val s = collection.mutable.Set(1)
val s1 = s += 2  // s and s1 are now mutable Set(1, 2)

無法重構

var s = Set(1) // immutable
var s1 = s += 2  // s is immutable Set(1, 2), s1 is now ()

同時保持原有的意義。 這個設計決定背后的原因是什么?

(這顯然只是猜測)

可變Scala集合旨在用作不可變集合的Builder JVM上有一個非常突出且非常古老的不可變數據結構: String 相應的構建器(不以任何方式與Scala綁定)已經存在於Java中:它是StringBuilder 如果您查看文檔,您將看到append了多個版本的重載方法。 每次都返回StringBuilder本身,它允許您編寫以下內容:

// java code
myBuilder
  .append('h')
  .append('i');

我猜Scala collection.mutable API只是簡單地模仿了Java的StringBuilder的行為,但是將append(...)替換為稍短的+= 在一天結束時,它只是經典構建器模式的一個實現。

在不可變的情況下, s += 2s = s + 2 因此,如果你使s += 2求值為s的新值,那么你必須使每個賦值語句評估為賦值的結果。 其他語言也是這樣做的,但它在歷史上導致了錯誤,着名的C代碼如下:

if (x = 0) {
  ...
}

所以我認為沒有那個返回集合是有道理的。

另一方面,對於可變的情況, +=只是一個方法名稱,所以它不進行賦值,並且不能以有意義的方式真正對這種錯誤負責。 讓它返回自身可以實現有時有用的構建器模式鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM