理解Scala可变集val引用
在第三版《Scala编程》一书中,我看到了一个我无法理解的例子。为了理解它,我在scala解释器中输入了它:理解Scala可变集val引用,scala,Scala,在第三版《Scala编程》一书中,我看到了一个我无法理解的例子。为了理解它,我在scala解释器中输入了它: scala> import scala.collection.mutable import scala.collection.mutable scala> val movieSet = mutable.Set("Hitch", "Poltergeist") movieSet: scala.collection.mutable.Set[String] = Set(Polter
scala> import scala.collection.mutable
import scala.collection.mutable
scala> val movieSet = mutable.Set("Hitch", "Poltergeist")
movieSet: scala.collection.mutable.Set[String] = Set(Poltergeist, Hitch)
scala> movieSet
res3: scala.collection.mutable.Set[String] = Set(Poltergeist, Hitch) <<< res3
scala> movieSet += "Shrek"
res4: movieSet.type = Set(Poltergeist, Shrek, Hitch) <<< res4
scala>导入scala.collection.mutable
导入scala.collection.mutable
scala>val movieSet=mutable.Set(“挂接”,“恶鬼”)
movieSet:scala.collection.mutable.Set[String]=Set(Poltergeist,Hitch)
斯卡拉>电影集
res3:scala.collection.mutable.Set[String]=Set(Poltergeist,Hitch)res3
和res4只是对同一对象的附加引用,只要您使用非单位返回类型键入表达式,但不指定变量,scala shell就会生成这些引用。当您执行+=
操作时,该方法会对集合进行变异,并再次返回对同一对象的引用,因此res3
和res4
最终将包含该引用
您可以使用eq
方法检查两个值是否实际上是相同的精确对象(不是两个相等的对象)。也就是说,res3 eq电影集
和res4 eq电影集
都应该为真
val
限制变量始终引用同一个对象,但它不限制该对象以任何方式变异。mutable.Set#+=
具有签名
trait Set[A] {
def +=(elem: A): this.type
}
也就是说,它添加一个元素,然后返回它自己,大概这样您就可以链接调用,比如
set+=“a”+=“b”
。REPL为返回生成一个新的val
,这纯粹是因为它不知道什么更好。如果你在那之后输入了res3
,你就会看到突变。谢谢你的快速反应,乔·K。我误解了Scala外壳。