2017-08-11 1 views
1

「Programming in Scala 3/e」という本を読んでいるうちに、私は次の質問に答えました。なぜmutable.Set.empty ++ = ++ではなくtreeSetですか?

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を書くとき、それはxsysのすべての要素を追加し、xsの値を返すことを言います私たちが++=メソッドと呼ぶとき、副作用です。

しかし、この説明が有効であるためには、mutable.Set.emptyは左辺値などでなければならず、つまり定数値ではありません。しかし、私はそうは思わない。

私たちがmutable.Set.empty ++= treeSetが有効な表現である理由を誰でも説明できますか?

+0

は、なぜあなたは 'mutable.Set.empty'が一定であるということだと思います有効なのですか? 'mutable.Set.empty'は実際には新しい空集合を返す関数です。 http://www.scala-lang.org/api/2.12.0/scala/collection/mutable/Set$.html#empty[A]:scala.collection.mutable.Set[A] –

+0

ご返信ありがとうございます。しかし、私はまだ左値と右値の概念と混同しています。 Scalaでは、関数生成値に値を割り当てることができますか?この場合、なぜ '++'の代わりに '++ ='を使うのでしょうか? –

答えて

0

それは、私たちは、xs ++ = YSを書くとき、それは、xsにYSのすべての要素を追加し、++=方法がある場合はXS

の値を返すことを言って、それだけでこのメソッドを呼び出します。それはthere is such a method for collection.mutable.Setなので、ここで起こるのです。

このような方法がない場合、xsは実際には変数でなければなりません(ただし、「xsの値を返す」は「xsに結果を代入する」と置き換えてください)。

0

++++=の主な違いは、最初に新しいコレクションを作成することですが、2番目のコレクションでは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) 

だから、答えは - はい、++=

関連する問題