From: James Date: 2009-03-19T02:57:25+09:00 Subject: Is it safe to override #hash and #eql? to enable hash key equality? Hi, I would like to use object instances as hash keys where two objects containing the same datum both have the same key value. This does not work by default (as expected given that these are two different instances): class Foo def initialize(datum) @datum = datum end end # Two hash keys for the same datum a = {Foo.new(:baz) => 1, Foo.new(:baz) => 2} p a # => {#=>1, #=>2} However, this functionality can be obtained by overriding Object#hash and Object#eql?: class Bar attr_reader :datum def initialize(datum) @datum = datum end def hash @datum.hash end def eql?(other) @datum.eql? other.datum end end # One hash key for the same datum b = {Bar.new(:baz) => 1, Bar.new(:baz) => 2} p b #=> {#=>2} My simple question is if this is safe/normal/OK for my intentions. Based on perusal of the online Ruby documentation it looks like #eql? has been overridden in a number of sub-classes for the same purpose. But I wanted to get feedback from the community - has anyone here tried this? Are there any known side-effects? Thanks, -James