var和val都创建了不可变的Set,但var允许添加新值而val不允许

时间:2017-10-11 10:35:44

标签: scala collections immutability final

我来自Java背景并且正在尝试学习Scala。

下面的书中有一个例子" Scala编程 - 第三版"

var jetSet = Set("Boeing", "Airbus")
jetSet += "Lear"
println(jetSet.contains("Cessna"))

第一行创建一个不可变的非最终Set:

jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

第二行没有错误。

现在,当我将第一行从 var 更改为 val 时,第二行会出错:

<console>:13: error: value += is not a member of scala.collection.immutable.Set[String]
   jetSet += "Lear"

我无法理解背后的原因。 val 对应final,var为非final。我没有将变量分配给任何新的Set。在这两种情况下,Set都是不可变的。

var val 如何影响这里的事情?

此外,当jetSet在两种情况下都是不可变的时,为什么在 var 的情况下允许在集合中添加新值。它是否违反了不变性原则。

请纠正我的理解。

1 个答案:

答案 0 :(得分:1)

案例:1

scala> var jetSet = Set("Boeing", "Airbus")
jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

scala> jetSet
res3: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

scala> jetSet += "Lear"

scala> jetSet
res5: scala.collection.immutable.Set[String] = Set(Boeing, Airbus, Lear)

案例:2

scala> val jetSet = Set("Boeing", "Airbus")
jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

scala> jetSet += "Lear"
<console>:13: error: value += is not a member of scala.collection.immutable.Set[String]
       jetSet += "Lear"
              ^

如果:1使用var时。 +=理解如下

  

jetSet += "Lear"只是jetSet = jetSet + "Lear"

+将创建一个新的Set,其中添加了“Lear”以及其他已经在jetSet Set中的内容。

请注意,这里只有引用是可变的,但set是不可变的。 +方法创建一个新集合(新的参考代码将分配给可变变量。)

案例2:使用val时。编译器认为+=是方法,并试图找出是否在不可变的Set类中声明了这样的方法。因此,在val

的情况下,它会产生编译错误

Immutable Set没有声明+=方法。虽然声明了可变的Set +=方法。