2

文档说:

scala.collection.immutable 包中的集合保证对每个人都是不可变的。这样的集合在创建后永远不会改变

但我没有得到我期望的行为:

scala> var test3 = scala.collection.immutable.Set[String]("one", "two")
test3: scala.collection.immutable.Set[String] = Set(one, two)

scala> test3 += "three"

scala> println(test3)
Set(one, two, three)

我在这里想念什么?

4

2 回答 2

5

Avar可以重新分配(它是一个变量,所以它可以变化)。然后,您根本不再引用以前的对象。

Aval不能被重新分配(它是一个,所以它不能变化),但是你可以调用那个对象的方法,例如如果值是一个mutable集合。

当我说变化时,我基本上是指参考不能变化。这有点令人困惑,我知道。

换句话说:vals 和vars 都可以指向具有自身可以改变的内部状态的对象。就像一张可变地图。

我鼓励您自己编写一个代码示例来验证此表:

    | MutableSet                    | ImmutableSet
--------------------------------------------------
var | Reassign. Insert element      | Reassign
val | Insert                        | None of these
于 2016-06-02T17:13:20.003 回答
3

使用集合时有两件事要避免(如果可能)。如您所知,不可变集合比可变集合更受欢迎。但是,将不可变集合存储在可变变量中只会“延迟”问题。您将可变性以及它带来的所有问题从集合本身移到了保存集合的变量中。无论哪种方式,你都有一个状态。

理想的解决方案是避免两者。也就是说,同时使用不可变集合和不可变字段(vals)。例如,一个函数可以生成一个不可变的集合,而其他函数可以使用它,而不必将集合本身​​保存在某个地方或修改它。

于 2016-06-02T15:24:00.637 回答