技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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(整数) だけの問題なのね。