mutalbeなSetの+は新しいインスタンスを作る

遅ればせながらScalaの勉強を始めました。

教科書はコップ本。

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

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なんだから。

思ったこと

うーん、Scalaの文化に慣れる必要がありますね。
言語って文化と慣習があって、それは設計上の暗黙な前提になると思います。
私の場合はJavaに慣れきっていて、それを前提にScalaに触れるのでつまらないところでひっかかってる気がします。
予断を捨てて素直な気持ちでScalaに触れよう!と思いました。