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 都是不可变的。
var 或 val 如何影响这里的事情?
此外,当 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 中没有声明 +=
方法。虽然可变设置为 +=
方法声明。
我来自 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 都是不可变的。
var 或 val 如何影响这里的事情?
此外,当 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 butjetSet = jetSet + "Lear"
+
将创建一个新集合,其中 "Lear" 与 jetSet 集合中已有的其他集合一起添加。
注意这里只有reference是可变的,set是不可变的。 +
方法创建一个新集合(新的引用代码将分配给可变变量。)
情况2:使用val
时。编译器认为 +=
是方法并尝试查找是否在不可变集合 class 中声明了这样的方法。因此,在 val
.
Immutable Set 中没有声明 +=
方法。虽然可变设置为 +=
方法声明。