ruby - 如何使用“for”并更改红宝石哈希中的值?
问题描述
如果有哈希:
hash = {a:1, b: 2, c: 3}
试过这个:
for value in hash.values do
value = value * value
end
但返回相同的值而不是所需的值,我找到了一个解决方案:
hash.transform_values{ |value| value * value}
=> {:a=>1, :b=>4, :c=>9}
但是想用for循环来做,怎么办?
解决方案
我们有一个丰富的标准库来处理 Ruby 中的集合。它非常有用,涵盖了最需要的情况。我们有一个很棒的方法Enumerable#map,Enumerable#filter,Enumerable#reduce in ruby 等等。请阅读文档。
通用的方法是生成一个新的哈希:
new_hash = hash.each_with_object({}) { |(k, v), acc| acc[k] = v * v }
对于自 2.4.0 以来的 Ruby,您可以使用以下Hash#transform_values
方法:
hash.transform_values{ |value| value * value }
由于几个原因,我们更喜欢使用map, filter, transform_values
而不是。for
如:
- 尽量减少数据变异和副作用;
- 链接方法的能力,例如
collection.filter(&:empty?).map(&:size)
推荐阅读
- c++ - 根据条件 C++ 重新排序priority_queue
- swift - while 循环重置并第二次循环,不知道为什么?
- vb.net - 突出显示(选择)多行文本框中的最后一行文本
- c# - 将数据插入xml文件
- flurl - 我可以使用 SocketHttpHandler 代替 HttpMessageHandler 吗?
- python - 修改列表以准备写入 Excel 文件
- javascript - 如何使用 JavaScript 在两个值之间使用复选框动态更改 innerHTML?
- arrays - Delphi - 为什么使用 VarArrayPut?
- spf - 电子邮件与 DMARC 政策不匹配,而 SPF 似乎匹配
- regex - 如何在正则表达式中提取部分 URL 路径