我有这样的代码(我经常遇到这种方法签名,我来自java的noob):
def totals
t = 0
@data.each do |k, v|
t += v['totals'].to_i
end
t
end
@data
是哈希的哈希值,每个内部哈希值都有一个totals
键。如你所见,我总结了所有的总数。
这可以简化或以不同的风格编程(我确定!这是RUBY毕竟)?为什么我需要实例化t
?我没有直接从每个循环返回t
而没有最后一个条件?
它感觉不干净! OH等!我只记得街区,但我会等你的答案......
更新:
数据结构如下:
{ typeA: { items: [], totals: "10" }, typeB: { items: [], totals: "23" }}
我正在使用Rails!因此,如果Rails特定的函数超出了vanilla Ruby堆栈,它们也会很棒!
答案 0 :(得分:5)
由于您已经表明您使用的是Ruby on Rails,因此您可以利用Active Support的Enumerable#sum
方法:
def totals
@data.sum {|_,v| v['totals'].to_i }
end
答案 1 :(得分:4)
使用inject
:
def totals
@data.inject(0) do |t, (_, v)|
t + v['totals'].to_i
end
end
答案 2 :(得分:4)
def totals
@data.sum { |_,v| v['totals'].to_i }
end
您也可以使起始值与0
不同def totals(start_value= 0)
@data.sum(start_value) { |_,v| v['totals'].to_i }
end
答案 3 :(得分:4)
在Rails 5中,您可以利用Enumerable#pluck
h.values.pluck(:totals).map(&:to_i).sum
答案 4 :(得分:3)
@data.map{ |_, v| v['totals'].to_i }.inject(:+)
甚至更短:
@data.map{ |_, v| v['totals'].to_i }.sum