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.
···
--
Posted via http://www.ruby-forum.com/.
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
Suraj Kurapati wrote:
···
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.
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.
···
On Dec 10, 2006, at 11:33 , Suraj Kurapati wrote:
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?
--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
I LIT YOUR GEM ON FIRE!
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 Mon, 11 Dec 2006, Suraj Kurapati wrote:
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?
--
if you want others to be happy, practice compassion.
if you want to be happy, practice compassion. -- the dalai lama