Scala不可变集是可变的吗?

时间:2016-06-02 15:08:57

标签: scala set immutable-collections

文档说:

  

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)

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

可以重新分配var(它是变量,因此它可以变化)。然后,您根本不再引用上一个对象。

无法重新分配val(它是,因此它不能变化),但您可以调用该对象上的方法,例如该值为mutable集。

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

换句话说:valvar都可以指向内部状态可以改变的对象。就像一张可变的地图。

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

    | MutableSet                    | ImmutableSet
--------------------------------------------------
var | Reassign. Insert element      | Reassign
val | Insert                        | None of these

答案 1 :(得分:2)

使用集合时,有两件事需要避免(如果可能)。如你所知,不可变集合优于可变集合。但是,将不可变集合存储在可变变量中只会“延迟”解决问题。您将可变性及其从集合本身带来的所有问题移动到包含集合的变量。无论哪种方式,你都有一个州。

理想的解决方案是避免两者。也就是说,使用不可变集合和不可变字段(val)。例如,函数可以生成不可变集合,而其他函数可以使用它,而无需将集合本身​​保留在某处或修改它。