我正在尋找執行從字符串到整數的紅寶石散列值的轉換。如何在Ruby中將字符串的值從字符串轉換爲數組?
我認爲這與您在Ruby數組中執行轉換的方式(使用map方法)非常相似,但我一直無法找到一個不涉及將散列轉換爲數組,扁平化等等。
有沒有乾淨的解決方案來做到這一點?
EG。從
x = { "a" => "1", "b" => "2", "c"=> "3" }
要
x = { "a" => 1, "b" => 2, "c" => 3 }
我正在尋找執行從字符串到整數的紅寶石散列值的轉換。如何在Ruby中將字符串的值從字符串轉換爲數組?
我認爲這與您在Ruby數組中執行轉換的方式(使用map方法)非常相似,但我一直無法找到一個不涉及將散列轉換爲數組,扁平化等等。
有沒有乾淨的解決方案來做到這一點?
EG。從
x = { "a" => "1", "b" => "2", "c"=> "3" }
要
x = { "a" => 1, "b" => 2, "c" => 3 }
我首選的方案:
Hash[x.map { |k, v| [k, v.to_i]}] #=> {"a"=>1, "b"=>2, "c"=>3}
一個有點浪費一個(具有遍歷值的兩倍):
Hash[x.keys.zip(x.values.map(&:to_i))] #=> {"a"=>1, "b"=>2, "c"=>3}
p.keys.map { |key| p[key] = p[key].to_i }
這不起作用。塊參數位置不正確,'Array'或'Enumerable'都沒有一個名爲'to_map'的方法。 – sluukkonen 2012-04-06 07:16:00
'p.keys.map {| key | p [key] = p [key] .to_i}'是你的意思。 – 2012-04-06 07:19:23
to_map是我的自定義方法..只是忘了那..謝謝糾正 – 2012-04-06 07:21:04
試試這個:
x.each{|k,v| x[k]=v.to_i}
爲了避免修改原始哈希(不同於現有的答案),我會使用
newhash = x.reduce({}) do |h, (k, v)|
h[k] = v.to_i and h
end
如果您使用的是Ruby 1.9,您還可以使用Enumerable#each_with_object
來更加乾淨地實現相同的效果。
newhash = x.each_with_object({}) do |(k, v), h|
h[k] = v.to_i
end
如果你願意,你也可以提取邏輯放到一個模塊,它擴展了Hash
類。
module HMap
def hmap
self.each_with_object({}) do |(k, v), h|
h[k] = yield(k, v)
end
end
end
class Hash
include HMap
end
現在你可以使用
newhash = x.hmap { |k, v| v.to_i } # => {"a"=>1, "b"=>2, "c"=>3}
很好的徹底的答案,非常詳細。 – joelparkerhenderson 2012-04-06 07:46:03
謝謝!這個解決方案看起來就像我會用的那個。我認爲會有一些使用地圖功能的東西。 – Ken 2012-04-06 17:04:26
注意,這個答案創建了一箇中間數組('Enumerable#map'總是返回一個'Array'),所以對於大哈希,最好使用我的解決方案。 – sluukkonen 2012-04-17 12:24:35