結論:
eql?
はオブジェクトの値が同じかどうかを評価するequal?
はobject_id
が同じかどうかを評価する
irb(main):001:0> obj = %w(hoge bar baz) => ["hoge", "bar", "baz"] irb(main):003:0> copy = obj.dup => ["hoge", "bar", "baz"] # 値は同じなのでtrue irb(main):004:0> copy == obj => true # 値は同じなのでtrue irb(main):005:0> copy.eql? obj => true # object_idが違うのでfalse irb(main):006:0> copy.equal? obj => false
まとめ
eql?
は同値性を評価しているequal?
は同一性を評価している