Hash key : string or symbol!?

Hello,
I had to manipulate a hash (delete pairs, add pairs, )

But my problem is that the data comes sometimes as string and other
times as symbol, and this makes problems in updating the hash (sometimes
I have an entry 2 times with a symbol key and string key).

for example in this code:
hash = {:a => :b, 2 => 3, “g”=> 5 }
=> {2=>3, “g”=>5, :a=>:b}
h = {:a => :b, 2 => 4, :g=> 6 }
=> {:g=>6, 2=>4, :a=>:b}
hash.merge(h)
=> {:g=>6, 2=>4, “g”=>5, :a=>:b}

I want that the value of hash[“g”] changes to 6 without adding another
pair {:g => 6}

Someone has any idea?
thanks

If you have control of adding things to the hash you could call to_s
(or to_sym) on it to force it into a string or symbol.

Hope this helps,
Henrik H.

The easiest would be to decide which kind of key you really want
(String of Symbol), and ensure that you use only them.

Sorry for this a little bit sarcastic answer but Ruby’s behavior is
perfectly valid here.

blambeau

On Thu, Apr 9, 2009 at 10:31 AM, Abir B. [email protected] wrote:

h = {:a => :b, 2 => 4, :g=> 6 }
Posted via http://www.ruby-forum.com/.

new_hash = {}
hash.each { |k,v| new_hash[k.to_sym] = v }
h.each { |k,v| new_hash[k.to_sym] = v }

Andrew T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain

Andrew T. wrote:

h = {:a => :b, 2 => 4, :g=> 6 }
Posted via http://www.ruby-forum.com/.

new_hash = {}
hash.each { |k,v| new_hash[k.to_sym] = v }
h.each { |k,v| new_hash[k.to_sym] = v }

if we have nubers in the hash that we’ll be converted to nil with to_sym
:
hash = {:a => :b, 2 => 3, “g”=> 5 }
=> {2=>3, “g”=>5, :a=>:b}
h = {:a => :b, 2 => 4, :g=> 6 }
=> {:g=>6, 2=>4, :a=>:b}

new_hash = {}
=> {}
hash.each { |k,v| new_hash[k.to_sym] = v }
=> {2=>3, “g”=>5, :a=>:b}
h.each { |k,v| new_hash[k.to_sym] = v }
=> {:g=>6, 2=>4, :a=>:b}
hash
=> {2=>3, “g”=>5, :a=>:b}
h
=> {:g=>6, 2=>4, :a=>:b}
new_hash
=> {:g=>6, nil=>4, :a=>:b}

And I can’t control the inputs in the hash, so I must treat that by
myself

On Thu, Apr 9, 2009 at 11:40 AM, Abir B. [email protected] wrote:

if we have nubers in the hash that we’ll be converted to nil with to_sym
:
Then you could use
new_hash[k.kind_of?(Numeric) k : k.to_sym] = v

Andrew T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain

You could still loop through them and make them into strings instead
of symbols.

new_hash = {}
h.each { |k,v| new_hash[k.to_s] = v }

Regards,
Henrik H.