transform hash key from string into symbol

O

Old Echo

Hello Rubyists,
When dealing with hashes, I like using symbols for key names instead of
strings. Is there an easy way to convert hash keys from symbols into
strings?

E.g. I'd like to do something like this:

my_hash = YAML.load_file('my_file.yml')
=> { 'one' => 1, 'two' => 2, 'three' => 3 }
my_hash.super_cool_hash_key_string_to_sym_transformation #one line of
code?
...
my_hash
=> { :eek:ne => 1, :two => 2, :three => 3 }

Please display your ninja skills. : )

Thanks,
kodama
 
S

s.ross

class Hash
def super_cool_hash_key_string_to_sym_transformation
self.each_key{|k| k = k.to_sym}
self
end
end

-or-

my_hash.each_key{|k| k = k.to_sym}

Either of these work for you?
 
O

Old Echo

Hi Steve,
Thanks for your quick response, but I'm afraid that didn't do the trick.
It looks like the block just completes without actually changing
anything, or at least it doesn't transform what needs to be transformed.

Do you have any other suggestions?
 
G

Gregory Seidman

Hello Rubyists,
When dealing with hashes, I like using symbols for key names instead of
strings. Is there an easy way to convert hash keys from symbols into
strings?

E.g. I'd like to do something like this:

my_hash = YAML.load_file('my_file.yml')
=> { 'one' => 1, 'two' => 2, 'three' => 3 }
my_hash.super_cool_hash_key_string_to_sym_transformation #one line of
code?
...
my_hash
=> { :eek:ne => 1, :two => 2, :three => 3 }

Please display your ninja skills. : )

class Hash
def symbolize_keys
replace(inject({}) { |h,(k,v)| h[k.to_sym] = v; h })
end
end
Thanks,
kodama
--Greg
 
S

s.ross

Sorry. Look at Greg's for the keen Ruby way to do it. There should be
a symmetric stringify_keys for consistency as well.

My hash works as such:

class Hash
def symbolize_keys
t = self.dup
self.clear
t.each_pair{|k, v| self[k.to_sym] = v}
self
end
end

h = {'one' => 1, 'two' => 2}
puts h.symbolize_keys.inspect

{:eek:ne=>1, :two=>2}


Again, Greg's is cooler.
 
O

Old Echo

Thank you both for your answers. It's threads like these that make me so
so so happy to be programming with Ruby. :)
 
A

Andreas S

FYI, if you prefer, there is also 'facets' gem which has what you want. Yo=
u can selectively require parts of it. I think it's facets/hash_keyize.

http://facets.rubyforge.org/index.html

-andre
Date: Wed, 2 Jan 2008 09:29:11 +0900
From: (e-mail address removed)
Subject: Re: transform hash key from string into symbol
To: (e-mail address removed)
=20
Thank you both for your answers. It's threads like these that make me so
so so happy to be programming with Ruby. :)
--=20
Posted via http://www.ruby-forum.com/.
=20

_________________________________________________________________
Share life as it happens with the new Windows Live.
http://www.windowslive.com/share.html?ocid=3DTXT_TAGHM_Wave2_sharelife_1220=
07=
 
T

Trans

FYI, if you prefer, there is also 'facets' gem which has what you want. =
=A0You can selectively require parts of it. I think it's facets/hash_keyize.=


You're right, but that is the old library. Instead use Hash#rekey

require 'facets/hash/rekey'

{"a"=3D>1}.rekey #=3D> {:a=3D>1}
{:a=3D>1}.rekey(&:to_s) #=3D> {"a"=3D>1}
{"a"=3D>1}.rekey{|k| k.capitalize} #=3D> {"A"=3D>1}

T.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top