What's the right way to implement equality in ruby What's the right way to implement equality in ruby ruby ruby

What's the right way to implement equality in ruby


To simplify comparison operators for objects with more than one state variable, create a method that returns all of the object's state as an array. Then just compare the two states:

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]  endendp Thing.new(1, 2, 3) == Thing.new(1, 2, 3)    # => truep Thing.new(1, 2, 3) == Thing.new(1, 2, 4)    # => false

Also, if you want instances of your class to be usable as a hash key, then add:

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

These need to be public.


To test all your instance variables equality at once:

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


Usually with the == operator.

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