ruby典型的eql?and==实现
我一直在阅读ruby中ruby典型的eql?and==实现,ruby,equality,idioms,Ruby,Equality,Idioms,我一直在阅读ruby中eql?和=之间的差异,我知道=比较值,而eql?比较值和类型 根据ruby文档: 对于类对象的对象,eql?是==的同义词。子类通常延续这一传统,但也有例外 看起来文档中指定的行为并不是自动继承的,而是如何实现这些方法的建议。这是否也意味着,如果您覆盖==或eql?,那么您应该同时覆盖这两者 在下面的类Person中,这是覆盖eql?和=的典型方式吗,其中限制性较小的=只会委托给限制性较大的eql?(如果实现=只是为了比较值而不是类型,那么将eql?委托给=似乎是倒退的)
eql?
和=
之间的差异,我知道=
比较值,而eql?
比较值和类型
根据ruby文档:
对于类对象的对象,eql?是==的同义词。子类通常延续这一传统,但也有例外
看起来文档中指定的行为并不是自动继承的,而是如何实现这些方法的建议。这是否也意味着,如果您覆盖==
或eql?
,那么您应该同时覆盖这两者
在下面的类Person
中,这是覆盖eql?
和=
的典型方式吗,其中限制性较小的=
只会委托给限制性较大的eql?
(如果实现=
只是为了比较值而不是类型,那么将eql?
委托给=
似乎是倒退的)
我现在有点困惑了,文档中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
不是相等吗?你不应该重写吗?文档给出了具体的例子,说明了Numeric implements==和eql?differently你是对的,equal?是不应该被重写的。我更新了我的答案。@Vincent,如果==和eql?是同义词,我会认为重写一个会导致它们都有相同的行为。我试过了使用eql?和not==,然后我尝试重写==和not eql?,行为不一样,这就是为什么我对文档中它们是同义词感到困惑的原因。我在object的ruby源代码中也发现了这一点。c子类通常通过将
eql?
别名化为它们被重写的=
,来延续这一传统,因此听起来这并不是自动发生的。@Vincent,我就是这样做的,但我仍然对什么是“典型的”ruby行为感到困惑?eql的别名常见吗?和==像这样?
class Person
#...
def ==(other)
other.instance_of?(self.class) && @name == other.name
end
alias_method :eql?, :==
#...
end