Transform hash key from string into symbol

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
=> { :one => 1, :two => 2, :three => 3 }

Please display your ninja skills. : )

Thanks,
kodama

···

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

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?

···

On Jan 1, 2008, at 3:26 PM, Old Echo wrote:

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
=> { :one => 1, :two => 2, :three => 3 }

Please display your ninja skills. : )

Thanks,
kodama
--
Posted via http://www.ruby-forum.com/\.

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
=> { :one => 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

···

On Wed, Jan 02, 2008 at 08:26:31AM +0900, Old Echo wrote:

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?

Steve Ross wrote:

···

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?

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

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

{:one=>1, :two=>2}

Again, Greg's is cooler.

···

On Jan 1, 2008, at 3:53 PM, Old Echo wrote:

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?

Steve Ross wrote:

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?

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

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

···

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

FYI, if you prefer, there is also 'facets' gem which has what you want. You 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: kodama@bluexpanse.net
Subject: Re: transform hash key from string into symbol
To: ruby-talk@ruby-lang.org

Thank you both for your answers. It's threads like these that make me so
so so happy to be programming with Ruby. :slight_smile:
--
Posted via http://www.ruby-forum.com/\.

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

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

  require 'facets/hash/rekey'

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

T.

···

On Jan 1, 9:28 pm, Andreas S <andrea...@hotmail.com> wrote:

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