Defining key equivalence in a hash

Hello,

I’m trying to make two keys equivalent by having their #hash method
produce the same result. But this does not seem to work:

irb(main):001:0> class K; def hash; 90; end; end
=> nil
irb(main):002:0> h = {}
=> {}
irb(main):003:0> h[K.new] = 1
=> 1
irb(main):004:0> h.key? K.new # <---- I want this to return true!
=> false

What am I missing?

Thanks for your consideration.

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.

Dan

On Mon, 11 Dec 2006, Suraj K. wrote:

=> 1
irb(main):004:0> h.key? K.new # <---- I want this to return true!
=> false

What am I missing?

K#eql?

for example

harp:~ > cat a.rb
class K
attr ‘key’
def initialize() @key = 42 end
def hash() @key.hash end
def eql?(other) other.key == @key end
end

p K.new => ‘which’, K.new => ‘one’

harp:~ > ruby a.rb
{#<K:0xb75cca34 @key=42>=>“one”}

regards.

-a

On Dec 10, 2006, at 11:33 , Suraj K. wrote:

=> 1
irb(main):004:0> h.key? K.new # <---- I want this to return true!
=> false

What am I missing?

class K; def eql?(other) true; end; end

#eql? is called if o1.hash == o2.hash. If #eql? returns true the
objects belong to the same index.


Eric H. - [email protected] - http://blog.segment7.net

I LIT YOUR GEM ON FIRE!