If you put K.new into a variable, and then check for that, it will
return true:
irb(main):001:0> class K; def hash; 90; end; end
=> nil
irb(main):002:0> h = {}
=> {}
irb(main):003:0> k = K.new
=> #<K:0xb7cac4ac>
irb(main):004:0> h[k] = 1
=> 1
irb(main):005:0> h[k]
=> 1
irb(main):006:0> h.key? k
=> true
It’s because K.new creates a new location in memory for each call to it,
but h.key? checks the location in memory, not the contents of the keys
and the objects passed to it. So if you call K.new twice, each will
return a new location in memory.