Ruby 勉強してみる(変数のオブジェクト)
で、とりあえず変数に入るのがオブジェクトなので、気になるのは、変数間代入したときに、それは値渡しか、参照渡しか。
ソコが疑問。
というわけで、調べてみたらオブジェクトは「オブジェクトID」なるものがあるそーな。
ちょっくらつかって試してみるか。
sample1 = 55 sample2 = sample1 p sample1.object_id p sample2.object_id p 55.object_id
結果で言えば参照渡しなのね。
加えて言うと、同一リテラルは同一のオブジェクトが使い回されるということか。
str1 = "Fire" str2 = "F" + "i" + "re" p str1.object_id p str1.object_id p str1 == str2 p str1.equal?(str2)
でやってみると、true,false で結果が分かれた。
「==」が内容比較で、「equal?」が参照比較かっ!
Java と逆ですかそうですか。
しかし、次の仕様は解せない、、、、。
val1 = 22 val2 = 33 p val1.object_id p val2.object_id p val2 == val1 + 11 p val2.equal?(val1 + 11)
結果が「true 2個」…?
一体何が起きてんだ、、、、予測はしてみる。
- オブジェクトIDは、何らかの値計算の結果作られるから、整数では同じ数から同じオブジェクトIDが生まれる
- 整数はある値に対して、オブジェクトIDが一意に決まっている
- メモリを抑えるために、実行時に同じ値は同じ参照を行うよう仕様に盛り込まれている
- その他
実証は、、、、どうすりゃいいんだか。
まぁ調べてみるか。
こんなのが見つかった。
Fixnum(整数) だけの問題なのね。