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