アマグラミング

プログラミング初心者が勉強したことを復習とメモがてら書いているだけです。

(83)オブジェクトのIDについて学ぼう

オブジェクトには全てIDがある。

オブジェクトのIDはobject_idメソッドでわかります。

 

例えば

p "あ".object_id

実行すると

f:id:tiroru17:20170701131016p:plain

こんなふうにIDが返される。

 

オブジェクトのIDが同一かどうかはequal?メソッドを使う。

 

p "あ".object_id

a = "str"

b = "num"

c = "s"+"t"+"r"

d = a

p a.equal?(b)

p a.equal?(c)

p a.equal?(d)

 

実行すると

f:id:tiroru17:20170701133832p:plain

 

こんな感じ。

まずp "あ".object_idのIDの値が変化していることに注目。

IDはソースコードによって変化しているみたい。

変数aと変数cもIDは違うようだ・・・

 

だけどaとdは同じ。

これは変数のあたりの勉強をしてれば、特に疑問はない。

感覚的にも納得できる。

 

先のソースコード

p a == c

を追加して実行

p "あ".object_idはいらないから消す

f:id:tiroru17:20170701134356p:plain

 

これはtrue

IDは違っても、内容の値は一致している。

 

同様のことをeql?メソッドでもできるが、

基本的には==と同じふるまいをする

しかし数値になると違いが出てくる。

 

 p 1.0 == 1

 p 1.0.eql?(1)

これを実行すると

f:id:tiroru17:20170701134824p:plain

 

こうなる、数値としては同じといえるが

整数と浮動小数点込の数値なので

おそらく細かい属しているクラスまで判別しているのかなあ。

 

ハッシュのキーに数値を入れている場合も

内部ではeql?メソッドを使っているから

0と0.0は区別されているらしい。