Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中如何将哈希值从字符串转换为数组?_Ruby_Arrays_Hash - Fatal编程技术网

在Ruby中如何将哈希值从字符串转换为数组?

在Ruby中如何将哈希值从字符串转换为数组?,ruby,arrays,hash,Ruby,Arrays,Hash,我希望在Ruby哈希中执行从字符串到整数的值转换 我认为这与在Ruby数组中执行转换的方式(使用map方法)非常相似,但我一直未能找到一个优雅的解决方案,它不涉及将哈希转换为数组、将其展平等 有没有干净的解决办法 来自 x = { "a" => "1", "b" => "2", "c"=> "3" } 到 试试这个: x.each{|k,v| x[k]=v.to_i} 为了避免修改原始哈希(与现有答案不同),我将使用 如果您使用的是Ruby 1.9,还可以使用Enumera

我希望在Ruby哈希中执行从字符串到整数的值转换

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

有没有干净的解决办法

来自

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

试试这个:

x.each{|k,v| x[k]=v.to_i}

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

如果您使用的是Ruby 1.9,还可以使用
Enumerable#each_with_object
更清晰地实现相同的效果

newhash = x.each_with_object({}) do |(k, v), h|
  h[k] = v.to_i
end
如果您愿意,还可以将逻辑提取到模块中,并使用它扩展
散列

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}
我的首选解决方案:

Hash[x.map { |k, v| [k, v.to_i]}] #=> {"a"=>1, "b"=>2, "c"=>3}
有点浪费(必须在值上迭代两次):


这不管用。块参数位于错误的位置,
Array
Enumerable
都没有名为
to_map
p.keys.map{key | p[key]=p[key]。to_i}
的方法。to_map是我的自定义方法。。只是忘了。。感谢您的更正非常彻底的回答,非常详细。谢谢!这个解决方案似乎就是我要用的。我认为会有一些东西使用map函数。请注意,这个答案创建了一个中间数组(
Enumerable#map
总是返回一个
数组
),所以对于大哈希,最好使用我的解决方案。
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}
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}