On Feb 8, 2:29 pm, mike.le... / gmail.com wrote:
> I am having problems understanding the following:
>
> $ irb
> irb(main):001:0> VERSION
> => "1.8.5"
> irb(main):002:0> a={:c => nil, :d => nil}
> => {:c=>nil, :d=>nil}
> irb(main):003:0> b={:d => nil, :c => nil}
> => {:c=>nil, :d=>nil}
> irb(main):004:0> # As expected this is true
> irb(main):005:0* a == b
> => true
> irb(main):006:0> c={:a => nil, a => nil, :b => nil}
> => {:b=>nil, :a=>nil, {:c=>nil, :d=>nil}=>nil}
> irb(main):007:0> d={:b => nil, b => nil, :a => nil}
> => {:b=>nil, {:c=>nil, :d=>nil}=>nil, :a=>nil}
> irb(main):008:0> # Unexpectedly false
> irb(main):009:0* c == d
> => false
>
> Shouldn't they be equivalent ?

Let's make your example a little bit simpler to get at the core of the
matter:
  a = {}
  b = {}
  p a==b
  #=> true

  c = {1=>a}
  d = {1=>b}
  p c==d
  #=> true

  e = {a=>1}
  f = {b=>1}
  p e==f
  #=> false

Apparently it's enough for two values to be #== to one another, but
it's not good enough for two keys to be #== to one another.