Ruby:更新Hash值的最简单方法是什么?

时间:2011-03-07 04:07:10

标签: ruby hash

说:

h = { 1 => 10, 2 => 20, 5 => 70, 8 => 90, 4 => 34 }

我想将每个值v更改为foo(v),以便h为:

h = { 1 => foo(10), 2 => foo(20), 5 => foo(70), 8 => foo(90), 4 => foo(34) }

实现这一目标最优雅的方法是什么?

5 个答案:

答案 0 :(得分:102)

您可以使用update(别名merge!)使用块更新每个值:

hash.update(hash) { |key, value| value * 2 }

请注意,我们正在有效地将hash与自身合并。这是必需的,因为Ruby会调用块来解决碰撞的任何键的合并,并使用块的返回值设置值。

答案 1 :(得分:11)

Rails已添加transform_values(),因此您现在可以执行{a:1, b:2, c:3}.transform_values{|v| foo(v)}

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values

答案 2 :(得分:7)

这样做:

h.each {|k, v| h[k] = foo(v)}

答案 3 :(得分:5)

对于大型哈希,以下内容比@Dan Cheail稍快一些,并且功能编程风格稍微强一些:

new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]

Hash#map创建一个键值对数组,Hash.[]将对数组转换为哈希值。

答案 4 :(得分:0)

有几种方法可以做到;最直接的方法是使用Hash#each更新新哈希:

new_hash = {}
old_hash.each do |key, value|
  new_hash[key] = foo(value)
end