On 6/27/06, ts <decoux / moulon.inra.fr> wrote: > >>>>> "J" == Jacob Fugal <lukfugl / gmail.com> writes: > > J> The one question I do have regarding this is why isn't the default > J> implementation of Object#eql? as an alias to Object#==? The > J> documentation makes it clear that that's the intended behavior, and > J> the common behavior for descendants of Object as well. It seems odd > J> that it's not then codified as an alias. It seems redundant that we > J> have to always remember to alias #eql? if we override #==; why can't > J> it be the default to already be an alias? > > becuase this will change nothing <snip alias example> Ah, good point. And after reading that, it got me thinking about how the same question could be asked about why the default implementation isn't something like: class Object def eql?(other) self == other end end And thinking about that, I realized why. As Daniel Martin mentioned, the implication: a.eql?(b) implies a.hash == b.hash Should always be maintained. Now, if I recall correctly, the default Object behavior is: * hash returns the object_id * equal? compares object_ids (this should never be overridden) * == is implemented in terms of equal? * eql? also compares object_ids (maybe also implemented in terms of eql?) So by default, == and eql? are synonymous. But if we override ==, and eql? were to implicitly follow, but we didn't also override hash, the above implication would no longer hold. Chaos ensues. So the primary reason eql? is separate from == is that eql? needs to be sure to follow hash. So now my question is: why isn't the default implementation of eql? to compare hash instead of object_id? Then we can override hash in cases where we want to, and not need to worry about eql? unless we really need to... Jacob Fugal