mutalbeなSetの+は新しいインスタンスを作る
遅ればせながらScalaの勉強を始めました。
教科書はコップ本。
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
- 作者: Martin Odersky,Lex Spoon、Bill Venners,羽生田栄一,長尾高弘
- 出版社/メーカー: インプレス
- 発売日: 2009/08/21
- メディア: 単行本
- 購入: 18人 クリック: 687回
- この商品を含むブログ (121件) を見る
mutableなSetの"+"にはまる
immutable(変更不可能)なSetの場合、"+="を使って要素を追加した新しいSetインスタンスを得ることが出来ます。
var is = scala.collection.immutable.Set("A") is += "B" println(is)
上記の結果は
Set(A, B)
となります。
is += "B"という記述は
is = is + "B"
という記述に展開されるそうです。これは、isにメンバ"+="がない場合のルールです。
さて一方、mutable(変更可能)なSetにも+というメソッドがあります。
このメソッドにはまりました。レシーバを変更するのかと思いきや、実は新しいオブジェクトを作るらしい。
以下のコードで確認できます。
val ms = scala.collection.mutable.Set("A") ms + "B" println(ms)
このコードの実行結果は以下。
Set(A)
・・・msの内容が変わっていない・・・
これにはまりました。
一方で以下のように書くと、
val ms = scala.collection.mutable.Set("A") ms += "B" println(ms)
結果はこう↓なります。
Set(B, A)
mutableなSetに要素を突っ込むときはいちいち"+="を使う必要があるわけですね。
immutableとmutableで記法を変えなくてすむ、という点で"+="の有用性は分かります。
でも、mutableなSetの"+"はやっぱりインスタンスの中身を変えてほしかった、と思うのは私だけ?
だってmutableなんだから。