Confusion with Hash duplicate key removal

31 views
Skip to first unread message

Love U Ruby

unread,
Sep 10, 2013, 1:32:41 AM9/10/13
to rubyonra...@googlegroups.com
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?

--
Posted via http://www.ruby-forum.com/.

Dheeraj Kumar

unread,
Sep 10, 2013, 1:50:21 AM9/10/13
to rubyonra...@googlegroups.com
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'}

-- 
Dheeraj Kumar

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.

Tamara Temple

unread,
Sep 10, 2013, 3:27:13 AM9/10/13
to rubyonra...@googlegroups.com
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.

Frederick Cheung

unread,
Sep 10, 2013, 10:57:31 AM9/10/13
to rubyonra...@googlegroups.com

On Tuesday, September 10, 2013 8:27:13 AM UTC+1, tamouse wrote:
> 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?

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
Reply all
Reply to author
Forward
0 new messages