ruby典型的eql?和==实现

时间:2012-06-28 02:24:52

标签: ruby equality idiomatic

我一直在阅读ruby中eql?==之间的差异,我了解==比较值,eql?比较值和类型

根据ruby文档:

对于Object类的对象,eql?是==的同义词。子类通常会延续这一传统,但也有例外。

似乎不会自动继承文档中指定的行为,而是仅仅是如何实现这些方法的建议。这是否也意味着如果您覆盖==eql?,那么您应该覆盖它们吗?

在下面的课程Person中,这是覆盖eql?==的典型方式,其中限制较少的==只是委托给限制性较强的{{1} (如果eql?仅用于比较值而不是类型,那么将eql?委托给==似乎倒退了。

==

1 个答案:

答案 0 :(得分:4)

我现在感到困惑,aliasing eql的文档是什么意思?和==方法实现如下:

class Test
  def foo
    "foo"
  end
  alias_method :bar, :foo
end

baz = Test.new
baz.foo #=> foo
baz.bar #=> foo

#override method bar
class Test
  def bar
    "bbq!"
  end
end

baz = Test.new
baz.foo #=> foo
baz.bar #=> bbq!

这就是为什么当你重写==时,它不会影响eql?即使他们是'同义词'。所以在你的情况下,它应该是:

class Person
  #...
  def ==(other)
    other.instance_of?(self.class) && @name == other.name
  end
  alias_method :eql?, :==
  #...
end