用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