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

Both var and val are creating immutable Set, but var is allowing to add a new value whereas val is not

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

书中有如下例子"Programming in Scala - Third Edition"

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

第一行创建了一个不可变的非最终集合:

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是non-final。我没有将变量分配给任何新的 Set。在这两种情况下,Set 都是不可变的。

varval 如何影响这里的事情?

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

请纠正我的理解。

案例: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" is nothing but jetSet = jetSet + "Lear"

+ 将创建一个新集合,其中 "Lear" 与 jetSet 集合中已有的其他集合一起添加。

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

情况2:使用val时。编译器认为 += 是方法并尝试查找是否在不可变集合 class 中声明了这样的方法。因此,在 val.

的情况下会出现编译错误

Immutable Set 中没有声明 += 方法。虽然可变设置为 += 方法声明。