Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby典型的eql?and==实现_Ruby_Equality_Idioms - Fatal编程技术网

ruby典型的eql?and==实现

ruby典型的eql?and==实现,ruby,equality,idioms,Ruby,Equality,Idioms,我一直在阅读ruby中eql?和=之间的差异,我知道=比较值,而eql?比较值和类型 根据ruby文档: 对于类对象的对象,eql?是==的同义词。子类通常延续这一传统,但也有例外 看起来文档中指定的行为并不是自动继承的,而是如何实现这些方法的建议。这是否也意味着,如果您覆盖==或eql?,那么您应该同时覆盖这两者 在下面的类Person中,这是覆盖eql?和=的典型方式吗,其中限制性较小的=只会委托给限制性较大的eql?(如果实现=只是为了比较值而不是类型,那么将eql?委托给=似乎是倒退的)

我一直在阅读ruby中
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