提问人:Suhjin Park 提问时间:8/11/2017 更新时间:8/11/2017 访问量:203
为什么可变。Set.empty ++= treeSet 而不是 ++?
Why mutable.Set.empty ++= treeSet instead of ++?
问:
在阅读《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 ++= ys
ys
xs
xs
++=
然而,为了使这种解释有效,必须是一个左值或其他东西,即它不是一个常数值。但我不这么认为。mutable.Set.empty
谁能解释为什么我们是一个有效的表达方式?mutable.Set.empty ++= treeSet
答:
0赞
Alexey Romanov
8/11/2017
#1
它说当我们写 xs ++= ys 时,它会将 ys 的所有元素添加到 xs 并返回 xs 的值
如果有方法,它只是调用此方法。这就是这里发生的事情,因为有这样一个 collection.mutable.Set
方法。++=
如果没有这样的方法,确实需要是一个变量(尽管“返回”的值应该替换为“将结果分配给”)。xs
xs
xs
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)
所以,答案 - 是的,是有效的++=
评论
mutable.Set.empty
mutable.Set.empty
++=
++