2010-04-03 35 views
1

返回哈希與修改後的值,我想這樣的:在Ruby中

{: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#collectHash#map的變體。有任何想法嗎?

回答

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,** Ruby **在Ruby 1.9中,'Array#to_s'產生與'Array#inspect'相同的結果。我不知道這是否適用於以前的版本。 – 2010-04-04 18:34:32

+0

@smotchkiss我剛剛嘗試過在1.9.1-p378上使用irb,並且..你是對的:)不知道。對於紅寶石1.8.7雖然[1,2,3] .to_s只是返回「123」。 – rubiii 2010-04-04 19:36:43

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,有沒有做修改散列的任何方法? – 2010-04-03 18:51:05

+0

我編輯了答案,向您展示瞭如何在不修改散列號的情況下執行此操作 – glebm 2010-04-03 18:53:58

+0

@glebm,我希望**修改原始散列。我不需要修改它:) – 2010-04-03 18:57:19