Ruby中的"=="实现应该检查类型吗?

Ami*_*far 5 ruby equality

我想实现==一个ruby类.我可以

def ==(o)
  o.respond_to?(:id) && self.id == o.id
end
Run Code Online (Sandbox Code Playgroud)

要么

def ==(o)
  o.is_a?(Foo) && self.id == o.id
end
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,前者似乎更有意义.如果我正在实施eql?那么我会做后者.它是否正确?

tad*_*man 1

这取决于您是与任意对象还是特定类型的对象进行比较。第二种形式是特定的,第一种形式是通用的。

就您而言,您可能对特定形式感到满意。仅当您要比较的对象可以转换或解释为可以匹配的对象时,通用比较才有意义。使用id似乎太开放了。这意味着当 Foo 10 和 Bar 10 可能来自完全不同的来源时,它们是等效的。