From: "Molitor, Stephen L" Date: 2006-06-28T03:59:00+09:00 Subject: Re: Ruby and Java equality usage >>>> Jacob Fugal wrote: > Is it true then that a.eql?(b) only if a.hash == b.hash? Yes. But not necessarily the vice versa. If a.eql?(b) is true, then a.hash == b.hash must also be true. And if a.hash != b.hash, then a.eql?(b) is necessarily false. However if a.hash == b.hash, then a.eql?(b) may be true or false. (The above is all assuming proper implementations of hash and eql?.) > What's the damage in a.eql?(b) returning true when in different > buckets? That will never happen. If a and b have different hashes then they go in different buckets. And if their hashes are different they are not equivalent (not eql?). > Why doesn't the default implementation of Object#eql? just use #== > internally? Good question! Or to put it another way why do we need separate == and eql? methods? The only rationale I can think of is to completely separate the hash related methods (eql? and hash) from ==. So I can override == knowing that I won't be changing hash behavior at all. Except that if I'm overriding == I would usually want to change the hash related behaviors to be consistent with my new concept of equivalence! Steve