用ruby实现平等的正确方法是什么?

对于一个简单的结构类的类:

class Tiger attr_accessor :name, :num_stripes end 

什么是正确实现平等的正确方法,确保=====eql? 等等工作,所以这个类的例子在集合,哈希等等中很好地发挥作用。

编辑

另外,当你想根据没有暴露在类之外的状态进行比较时,什么是实现平等的好方法? 例如:

 class Lady attr_accessor :name def initialize(age) @age = age end end 

在这里,我希望我的平等方法考虑到@age,但是Lady不会将她的年龄暴露给客户。 在这种情况下,我必须使用instance_variable_get吗?

为了简化具有多个状态variables的对象的比较运算符,创build一个将所有对象的状态作为数组返回的方法。 那么就比较两个状态:

 class Thing def initialize(a, b, c) @a = a @b = b @c = c end def ==(o) o.class == self.class && o.state == state end protected def state [@a, @b, @c] end end p Thing.new(1, 2, 3) == Thing.new(1, 2, 3) # => true p Thing.new(1, 2, 3) == Thing.new(1, 2, 4) # => false 

此外,如果您希望您的类的实例可用作散列键,请添加:

  alias_method :eql?, :== def hash state.hash end 

这些需要公开。

要一次testing所有的实例variables相等:

 def ==(other) other.class == self.class && other.state == self.state end def state self.instance_variables.map { |variable| self.instance_variable_get variable } end 

通常与==运算符。

 def == (other) if other.class == self.class @name == other.name && @num_stripes == other.num_stripes else false end end