Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Scala可变集val引用_Scala - Fatal编程技术网

理解Scala可变集val引用

理解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编程》一书中,我看到了一个我无法理解的例子。为了理解它,我在scala解释器中输入了它:

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外壳。