Object Equality in Ruby

In order to have a correct object equality we need to implement these three methods: #==, #eql?, #hash.

Assume #item_name, and #qty are all the public values in an object.

Given #== should check equality based on the attribute values of two objects:

def ==(other)
  item_name == other.item_name && qty == other.qty
end

When it comes to checking equality via uniqueness, we need to define #eql?.

def eql?(other)
  hash == other.hash
end

#hash is expected to return unique values, since they are used when putting an object in or out of a Set, Hash, and the like.

def hash
  self.item_name.hash ^ self.qty.hash
end

Beware that since hashes should be unique we need to make sure the hashes we produce don’t collide with those produce by others.