2

申し訳ありませんが、私は最近、"Programming in Scala", 2nd Edition on page 685 の例を見て、私には奇妙に思えました:

var hashSet: Set[C] = new collection.immutable.HashSet
hashSet += elem1

不変コレクションに何かを追加するにはどうすればよいですか? REPL を試してみたところ、問題なく動作しました。

> scala
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var s : Set[Int] = collection.immutable.HashSet()
s: Set[Int] = Set()

scala> s += 1324

scala> println(s)
Set(1324)

奇妙な事実は、 += 演算子がimmutable.HashSet api ページで定義されていないことです。何が起こっているのか理解できる人はいますか?

ありがとう。

4

3 に答える 3

3

これを観察してください:

scala> var hashSet: Set[Int] = new collection.immutable.HashSet
hashSet: Set[Int] = Set()

scala> val set2 = hashSet + 1234
set2: scala.collection.immutable.Set[Int] = Set(1234)

scala> set2
res20: scala.collection.immutable.Set[Int] = Set(1234)

scala> hashSet
res21: Set[Int] = Set()

したがって、不変の hashSet には何も追加されません。hashSet建立当時のままです。+完全に新しいセットを返し、元のセットは変更されません。

あなたがするとき、それは( HashSetにメソッドが存在しhashSet += 1234ないことに注意してください)のscala省略形です:+=

val temp = hashSet + 1234
hashSet = temp

+=このプロトコルに従うすべてのクラスで機能します。要するに、あなたがするときa += 12。と同じ型を返し、代入可能でaなければならないメソッドが必要です (つまり、 a 。 val では機能しません。これを試してください: )。+aavarval i = 23; i+=1

于 2015-04-27T05:11:37.373 に答える
2

簡潔な答え

を持っているvarので、それに再割り当てできます。したがって+=、この場合は次のように変換されます

hashSet = hashSet + elem

+が定義されている限り、他のタイプと同様に

var i = 0
i += 1
i = i + 1

詳細

immutable.HashSeth+メソッドを持っています

要素が既に存在しない限り、追加の要素で新しいセットを作成します。

ドキュメントによると。

+=このクラスにはメソッドが定義されていないため、コンパイラによって提供さ+=れる合成メソッドになります。これは、右側のオペランドを渡して結果を左側のオペランドに割り当てることにより、左側のオペランドのメソッドを呼び出すだけの演算子として機能します。+

于 2015-04-27T05:15:44.853 に答える