ruby中哈希值求和的简便方法

ruby中哈希值求和的简便方法,ruby,Ruby,具有如下哈希值: d = {a: {c: 1, d:3 }, b: {c: 2, d: 6}, ...} 对c:中的所有值求和的更简单方法是什么 d.values.map { |val| val[:c] }.reduce(&:+) 解释: d.values => [{:c=>1, :d=>3}, {:c=>2, :d=>6}] d.values.map { |val| val[:c] } => [1, 2] 从这一点上讲,您可以使用reduce

具有如下哈希值:

d = {a: {c: 1, d:3 }, b: {c: 2, d: 6}, ...}

c:
中的所有值求和的更简单方法是什么

d.values.map { |val| val[:c] }.reduce(&:+)
解释:

d.values
=> [{:c=>1, :d=>3}, {:c=>2, :d=>6}]

d.values.map { |val| val[:c] }
=> [1, 2]
从这一点上讲,您可以使用
reduce(&:+)
来获取总和,或者如果您使用的是rails(或需要的主动支持),则可以使用Array#sum


reduce(&:+)
reduce{| memo,val | memo+val}
只需检查散列并求和它们的
:c
值即可

d.values.sum { |h| h[:c] }
=> 3
甚至更短(来自萨加尔·潘迪亚的评论):


如果希望允许任意深度的嵌套哈希,可以使用以下递归方法

def sum_cees(h)
  h.sum { |k,v| v.is_a?(Hash) ? sum_cees(v) : k == :c ? v : 0 }
end

sum_cees({ a: { c: 1, d:3 }, b: { d: { m: { c: 2, e: 6 } }, f: { c: 3} },
           g: { c: 4 },  n: { r: 3 } })
  #=> 10 

您可以省略
&
数组#sum
在Ruby中可用>=2.4“比什么更容易”和“更短?”“用c求和所有值:”–这是什么意思?您预期的结果是什么?您遇到问题的代码是什么?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?请提供一个。你能提供你想要发生的事情的精确说明吗,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请务必提供一个“求和
c:
中所有值的最简单方法是什么?”——您可以通过编写一个这样做的程序来实现。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有到那时,才能把你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,然后问一个集中、狭窄的问题
def sum_cees(h)
  h.sum { |k,v| v.is_a?(Hash) ? sum_cees(v) : k == :c ? v : 0 }
end

sum_cees({ a: { c: 1, d:3 }, b: { d: { m: { c: 2, e: 6 } }, f: { c: 3} },
           g: { c: 4 },  n: { r: 3 } })
  #=> 10