2006-10-28
変数は箱じゃない
次の Ruby コードは C によく似ている。
a = 1 a += 2
しかし 1 行目の a が指し示すオブジェクトと 2 行目の a が指し示すオブジェクトは別物になる。
a = 1 p a.object_id #=> 3 a += 2 p a.object_id #=> 7
a というのはただの名前であって決して値の入れ物ではない。
a += 2
というのは
a = a + 2
であり、 a + 2 の結果として返るオブジェクトに a という名前をつけているわけだ。
int a; a = 1; a += 2;
それに対して C 言語 だと a に入っている値そのものに 2 を加算して a に入っている値をそのまま上書きする。 C に慣れすぎていたせいですべてが参照という世界はなかなか理解できないかった。
けどこんなことは知らなくても普通に C の感覚で Ruby のコードは書けてしまう。参照を知らずにコードを書いていたころも罠にはまったことはほとんどなかった。