可变集 += 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 集合旨在用作不可变集合的生成器。JVM上有一个非常突出且非常古老的不可变数据结构:String。相应的构建器(与Scala没有任何联系(已经存在于Java中:它是StringBuilder。如果您查看文档,您将看到重载方法的数十个版本append。每次,它都会返回StringBuilder本身,这允许您编写以下内容:

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

我猜 Scalacollection.mutableAPI 只是模仿了 JavaStringBuilder的行为,但用更短的+=替换了append(...)。归根结底,它只是经典构建器模式的实现。

在不可变的情况下,s += 2s = s + 2相同。因此,如果你s += 2求值到新的值s,那么你就必须让每个赋值语句都计算到赋值的结果。其他语言也是这样做的,但它在历史上导致了错误,著名的 C 代码如下:

if (x = 0) {
...
}

所以我认为不让它返回集合是有道理的。

另一方面,对于可变情况,+=只是一个方法名称,因此它不进行赋值,也不能真正以有意义的方式对这种错误负责。让它自身返回可以实现有时有用的构建器模式链接。

最新更新