为什么mutable.Set.empty ++ = treeSet而不是++?

时间:2017-08-11 07:37:24

标签: scala collections mutable

在阅读本书" 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是一个有效的表达式吗?

2 个答案:

答案 0 :(得分:0)

  

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

如果有++=方法,则只调用此方法。这就是因为there is such a method for collection.mutable.Set而发生的事情。

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

答案 1 :(得分:0)

++++=方法之间的主要区别在于,第一个创建新集合,而第二个仅添加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)

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