2010-04-03 2 views

ответ

3

вы могли бы использовать 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 } 
+0

@rubiii, ** note ** в Ruby 1.9, 'Array # to_s' производит тот же результат, что и' Array # inspect'. Я не знаю, верно ли это для предыдущих версий. –

+0

@smotchkiss я просто попытался использовать irb на 1.9.1-p378 и .. вы правы :) не знал этого. для ruby ​​1.8.7, хотя [1,2,3] .to_s просто возвращает «123». – rubiii

1

Ваш материал не работает, потому что 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 }  
+0

@glebm, есть ли метод, который делает изменения хэш? –

+0

Я отредактировал ответ, чтобы показать вам, как это сделать без изменения хэша – glebm

+0

@glebm, i ** хотите ** изменить исходный хеш. Мне не нужно его изменять :) –

Смежные вопросы