[英]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 += 2
與s = s + 2
。 因此,如果你使s += 2
求值為s
的新值,那么你必須使每個賦值語句評估為賦值的結果。 其他語言也是這樣做的,但它在歷史上導致了錯誤,着名的C代碼如下:
if (x = 0) {
...
}
所以我認為沒有那個返回集合是有道理的。
另一方面,對於可變的情況, +=
只是一個方法名稱,所以它不進行賦值,並且不能以有意義的方式真正對這種錯誤負責。 讓它返回自身可以實現有時有用的構建器模式鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.