LoginSignup
3
2

More than 5 years have passed since last update.

Object#equal?とObject#eql?の違い

Posted at

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を指すのですね...!
中々面白いですね.

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2