红宝石典型的eql?和==实现

Jef*_*rey 6 ruby equality idiomatic

我一直在阅读有关之间的差异eql?==红宝石,据我所知,==而在比较值eql?的价值和类型进行比较

根据红宝石文档:

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

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

Person下面的类中,这是重写的典型方法,eql?并且==约束越少,则将其==委托给约束性更大的对象eql?(如果仅实现比较值而不是类型,则eql?委托给它似乎是倒向的)。====

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
Run Code Online (Sandbox Code Playgroud)

Vin*_*aca 4

我现在很困惑,文档中的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!
Run Code Online (Sandbox Code Playgroud)

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

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