Confusion with Hash duplicate key removal

Hi,

I have one basic question to ask regarding Hash key. Follow the below :

"foo".object_id # => 72994000
"foo".object_id # => 72993390
{"foo" =>2,"foo" =>3} # => {"foo"=>3}

I do know that Hash don't allow duplicate keys. But I would like to by
which method hash check if any duplicate key present into it or not? As
I can see "foo" have different `object_id`,which is expected. But in
case of Hash key how this two different objects "foo" is treated as same
object?

h = Hash.new
h.has_key?(‘foo’)

If you try to create duplicate keys, the existing value is replaced by the new one.

h = {“foo” =>2,“foo” =>3}

h # => {“foo”=>3}

h[‘foo’] = ‘bar’

h # => {“foo”=>‘bar’}

The hash's keys' object id's are not what is compared. If you take both of those strings, and did this:

"foo" == "foo"

You'd get true, regardless of the fact they have different object ids.

You are making this way way way more complicated than it is.

By default yes, eql? is used for hash keys (and eql? in turn generally calls ==).

You can ask for a hash to use object identity though:

h = {}.compare_by_identity => {}

h[‘a’] = 1 # => 1

h[‘a’] = 2 # => 2

h # => {“a”=>1, “a”=>2}

Although it’s not something I’ve ever needed or seen in the wild.

Fred