说:
h = { 1 => 10, 2 => 20, 5 => 70, 8 => 90, 4 => 34 }
Run Code Online (Sandbox Code Playgroud)
我想将每个值更改v为foo(v),这h将是:
h = { 1 => foo(10), 2 => foo(20), 5 => foo(70), 8 => foo(90), 4 => foo(34) }
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最优雅方式是什么?
Gar*_*eve 107
您可以使用update(别名merge!)使用块更新每个值:
hash.update(hash) { |key, value| value * 2 }
Run Code Online (Sandbox Code Playgroud)
请注意,我们正在有效地hash与自身合并.这是必需的,因为Ruby将调用块来解决碰撞的任何键的合并,将值设置为块的返回值.
Max*_*nus 16
Rails添加了Hash#transform_values,所以你现在可以做{a:1, b:2, c:3}.transform_values{|v| foo(v)}
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values
对于大型哈希,以下内容比@Dan Cheail略快,并且功能编程风格稍微强一些:
new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]
Run Code Online (Sandbox Code Playgroud)
Hash#map创建一个键值对Hash.[]数组,并将对数组转换为哈希值.
| 归档时间: |
|
| 查看次数: |
54150 次 |
| 最近记录: |