我来自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 的情况下允许在集合中添加新值。它是否违反了不变性原则。
请纠正我的理解。
答案 0 :(得分: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)
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 +=
方法。