2

我正在寻找将 Ruby 哈希中的值从字符串转换为整数。

我认为这与您在 Ruby 数组中执行转换的方式非常相似(使用 map 方法),但我无法找到一个优雅的解决方案,它不涉及将哈希转换为数组,将其展平, ETC。

有没有一个干净的解决方案来做到这一点?

例如。从

x = { "a" => "1", "b" => "2", "c"=> "3" }

x = { "a" => 1, "b" => 2, "c" => 3 }
4

4 回答 4

4

为避免修改原始哈希(与现有答案不同),我会使用

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}
于 2012-04-06T07:13:18.507 回答
3

我的首选解决方案:

Hash[x.map { |k, v| [k, v.to_i]}] #=> {"a"=>1, "b"=>2, "c"=>3}

A somewhat wasteful one (has to iterate over the values twice):

Hash[x.keys.zip(x.values.map(&:to_i))] #=> {"a"=>1, "b"=>2, "c"=>3}
于 2012-04-06T07:22:45.877 回答
2

试试这个:

x.each{|k,v| x[k]=v.to_i}
于 2012-04-06T06:47:09.180 回答
0
p.keys.map { |key| p[key] = p[key].to_i }
于 2012-04-06T06:47:06.280 回答