equal?メソッドとeql?メソッドでは何が違うのだろうと思い調べてみました.
hoge_1 = 'hoge'
hoge_2 = 'hoge'
hoge_1.hash
=> -2293525597087874374
hoge_2.hash
=> -2293525597087874374
上の出力を見るとわかりますが,同じ文字列を違う変数に入れてますが,ハッシュは同じ値です.
それでは,equal?メソッドとeql?メソッドを使って比較しましょう.
hoge_1.equal?(hoge_2)
=> false
hoge_1.eql?(hoge_2)
=> true
...(´゚д゚`)
何が違うのでしょう...
じゃあ次はそれぞれのオブジェクトIDを比較してみたいと思います.
hoge_1.object_id
=> 2168720820
hoge_2.object_id
=> 2168704840
何となく分かりました.
中身は同じ文字列であってもオブジェクトIDは違うのですね!!
つまり...
equal?メソッドはオブジェクトIDも比較して, eql?メソッドではオブジェクトIDまでは比較しないという事ですね!!(こういう理解で良いのかな...)
ちなみにちなみに...
StringオブジェクトのオブジェクトIDを調べてみました.
'hoge'.object_id
=> 2156471440
'hoge'.object_id
=> 2156440200
'hoge'.object_id
=> 2156412440
ほぉほぉ,毎回オブジェクトIDが変わると...
じゃあ次は同じシンボル名だとどうなるのかな...??
:hoge.object_id
=> 538568
:hoge.object_id
=> 538568
:hoge.object_id
=> 538568
同じシンボル名だと同じオブジェクトIDを指すのですね...!
中々面白いですね.