【发布时间】:2010-04-03 18:45:09
【问题描述】:
我正在尝试这个:
{: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 的变体。有什么想法吗?
【问题讨论】:
我正在尝试这个:
{: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 的变体。有什么想法吗?
【问题讨论】:
你可以使用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 }
【讨论】:
Array#to_s 产生与 Array#inspect 相同的结果。我不知道以前的版本是否如此。
你的东西不起作用,因为 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 }
【讨论】:
to_s 返回“123”,而inspect 返回“[1, 2, 3]”。