我一直在阅读ruby中eql?
和==
之间的差异,我了解==
比较值,eql?
比较值和类型
根据ruby文档:
对于Object类的对象,eql?是==的同义词。子类通常会延续这一传统,但也有例外。
似乎不会自动继承文档中指定的行为,而是仅仅是如何实现这些方法的建议。这是否也意味着如果您覆盖==
或eql?
,那么您应该覆盖它们吗?
在下面的课程Person
中,这是覆盖eql?
和==
的典型方式,其中限制较少的==
只是委托给限制性较强的{{1} (如果eql?
仅用于比较值而不是类型,那么将eql?
委托给==
似乎倒退了。
==
答案 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