为什么可变。Set.empty ++= treeSet 而不是 ++?

Why mutable.Set.empty ++= treeSet instead of ++?

提问人:Suhjin Park 提问时间:8/11/2017 更新时间:8/11/2017 访问量:203

问:

在阅读《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

根据 Scala 的引用,它说当我们写 时,它会添加 的所有元素 to 并返回 的值,即当我们调用该方法时存在副作用。xs ++= ysysxsxs++=

然而,为了使这种解释有效,必须是一个左值或其他东西,即它不是一个常数值。但我不这么认为。mutable.Set.empty

谁能解释为什么我们是一个有效的表达方式?mutable.Set.empty ++= treeSet

斯卡拉 收集 可变

评论

0赞 sarveshseri 8/11/2017
为什么你认为这是一个常数? 实际上是一个返回新空集的函数。scala-lang.org/api/2.12.0/scala/collection/mutable/......mutable.Set.emptymutable.Set.empty
0赞 Suhjin Park 8/11/2017
感谢您的回复。但我仍然对左值和右值的概念感到困惑。在 Scala 中,函数生成的值可以被赋值吗?在这种情况下,为什么我们使用而不是?++=++

答:

0赞 Alexey Romanov 8/11/2017 #1

它说当我们写 xs ++= ys 时,它会将 ys 的所有元素添加到 xs 并返回 xs 的值

如果有方法,它只是调用此方法。这就是这里发生的事情,因为有这样一个 collection.mutable.Set 方法++=

如果没有这样的方法,确实需要是一个变量(尽管“返回”的值应该替换为“将结果分配给”)。xsxsxs

0赞 Alexandr Dorokhin 8/11/2017 #2

和 方法之间的主要区别在于,第一个方法创建新集合,而第二个方法只是从 to set 添加元素。如果需要使用可变集合,则每次都创建新集合是没有意义的。例如:++++=treeSet

val treeSet = collection.immutable.TreeSet(1,2)
val mSet = collection.mutable.Set.empty[Int]
mSet ++ treeSet // creates new Set(1, 2) and doesn't change mSet
println(mSet) // Set()
mSet ++= treeSet // adds to mSet all elements from treeSet
println(mSet) // Set(1, 2)

所以,答案 - 是的,是有效的++=