In Ruby 1.8, Hash#== uses #== to compare values:
{1 => 2} == {1 => 2.0} # true
and Hash#eql? defaults to object identity:
h = {1=>2}
h.eql?({1=>2}) # false
h.eql?(h) # true
So #eql? is never used to compare hash values in 1.8.
In trunk it seems that Hash#eql? actually punts
to Hash#==, which means that
{1=>2}.eql?({1=>2.0}) # true
is true even though 2.eql?(2.0) is false.
Shouldn't Hash#eql? uses the stricter #eql?
test on the values rather than the looser #== test?
I'd attempt a patch but it looks like the Hash
implementation has changed quite a bit and there
is some tricky thread/recursion code that I haven't
studied.
Gary Wright