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.