Вернуть хеш с измененными значениями в Ruby - PullRequest
1 голос
/ 03 апреля 2010

Я пытаюсь это:

{:id => 5, :foos => [1,2,3]}.each {|k,v| v.to_s}

Но это возвращается:

{:id=>5, :foos=>[1, 2, 3]}

Я бы хотел увидеть это:

{:id=>"5", :foos=>"[1, 2, 3]"}

Я также пробовал варианты Hash#collect и Hash#map. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

вы можете использовать Object#inspect:

{ :id => 5, :foos => [1, 2, 3] }.inject({}) do |hash, (key, value)|
  hash.merge key => value.inspect
end

, который возвращает:

{ :foos => "[1, 2, 3]", :id => "5" }

или если вы хотите, чтобы это было разрушительным:

hash = { :id => 5, :foos => [1, 2, 3] }
hash.each_key { |key| hash[key] = hash[key].inspect }
1 голос
/ 03 апреля 2010

Ваш материал не работает, потому что v.to_s не изменяет v, поэтому, по сути, блок ничего не делает.

Вы можете сделать это так:

hash = {:id => 5, :foos => [1,2,3]}
hash.each_key { |k| hash[k] = hash[k].to_s }

Если вы не хотите изменять хеш:

hash = {:id => 5, :foos => [1,2,3]}
new_hash = {}
hash.each_key { |k| new_hash[k] = hash[k].to_s }    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...