Ruby:什么是最简单的方法来更新哈希值?
说:
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) }
什么是最优雅的方式来实现这一目标?
您可以使用update
( merge!
别名merge!
)来使用块更新每个值:
hash.update(hash) { |key, value| value * 2 }
请注意,我们正在有效地将hash
与自身进行合并。 这是需要的,因为Ruby将调用该块来解决碰撞的任何键的合并,并使用该块的返回值设置该值。
Rails添加了transform_values()
,所以你现在可以做{a:1, b:2, c:3}.transform_values{|v| foo(v)}
{a:1, b:2, c:3}.transform_values{|v| foo(v)}
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values
这将做到:
h.each {|k, v| h[k] = foo(v)}
下面的内容比@Dan Cheail对于大型哈希稍快一些,而且稍微有些function编程风格:
new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]
Hash#map
创build一个键值对的数组, Hash.[]
将这个对的数组转换成一个哈希。
有几种方法可以做到这一点。 最直接的方法就是使用Hash#each
来更新一个新的散列:
new_hash = {} old_hash.each do |key, value| new_hash[key] = foo(value) end