首页 > 解决方案 > 如何使用“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循环来做,怎么办?

标签: rubyfor-loop

解决方案


我们有一个丰富的标准库来处理 Ruby 中的集合。它非常有用,涵盖了最需要的情况。我们有一个很棒的方法Enumerable#mapEnumerable#filterEnumerable#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)

推荐阅读