【发布时间】:2018-01-19 15:15:14
【问题描述】:
在阅读《Scala 3/e 编程》一书时,我陷入了以下问题。
首先,本书解释了为了从不可变集合创建可变集合,将代码编写为:
scala> import scala.collections.immutable.TreeSet
scala> val colors = List("blue", "green", "red")
scala> val treeSet = TreeSet(colors)
scala> val mutaSet = mutable.Set.empty ++= treeSet
-> mutaSet: scala.collection.mutable.Set[String] =
Set(red, blue, green, yellow)
scala> val immutaSet = Set.empty ++ mutaSet
-> immutaSet: scala.collection.immutable.Set[String] =
Set(red, blue, green, yellow)
我无法理解的是以下行中++=方法的使用:
val mutaSet = mutable.Set.empty ++= treeSet
根据the Scala reference,它说当我们写xs ++= ys时,它将ys的所有元素添加到xs并返回xs的值,即当我们调用时有一个副作用++= 方法。
然而,为了使这个解释有效,mutable.Set.empty 必须是一个左值或其他东西,即它不是一个常量值。但我不这么认为。
谁能解释为什么我们mutable.Set.empty ++= treeSet 是一个有效的表达式?
【问题讨论】:
-
为什么你认为
mutable.Set.empty是一个常数?mutable.Set.empty实际上是一个返回新空集的函数。 scala-lang.org/api/2.12.0/scala/collection/mutable/… -
感谢您的回复。但我仍然对左值和右值的概念感到困惑。在 Scala 中,函数生成的值可以赋值吗?而在这种情况下,为什么我们使用
++=而不是++?
标签: scala collections mutable