Just do IT

思うは招く

Ruby の eql? と equal? の違い

結論:

  • 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?は同一性を評価している