在阅读本书" 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
是一个有效的表达式吗?
答案 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)
所以,答案 - 是的,++=
是有效的