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

根据 ruby 文档:

对于Object类的对象,是否为eql?是==的同义词。子类通常会继承这一传统,但也有异常(exception)。

似乎文档中指定的行为似乎不会自动继承,但这只是有关如何实现这些方法的建议。这是否还意味着如果您覆盖==eql?,那么您应该覆盖这两者?

在下面的Person类中,这是重写eql?==的典型方法,其中,限制性较小的==只是委派给限制性较高的eql?(如果eql?仅用于比较值而不是实现值,则将==委托(delegate)给==似乎很倒类型)。

class Person

  def initialize(name)
    @name = name
  end

  def eql?(other)
    other.instance_of?(self.class) && @name == other.name
  end

  def ==(other)
    self.eql?(other)
  end

protected
    attr_reader :name

end

最佳答案

我现在很困惑,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

10-07 23:34