如何使用reduce方法改进这个求和问题

3

我想使用reduce方法来改进这个求和,但是我发现它适用于求和,但也需要进行减法操作:

final = 0
@status.each do |data|
  final = final + data['pending_increase'] - data['pending_decrease']
end

我想要使用的方法是 Enumerable#reduce
4个回答

5

类似这样的:

@status.reduce(0){|sum, data| sum + data['pending_increase'] - data['pending_decrease']}

或者

@status.map{|data| data['pending_increase'] - data['pending_decrease']}.reduce(0, :+)

谢谢!它完美地工作了,只有一个快速的问题...为什么在reduce(0)中要加零? - Brian Stanley
@BrianStanley:嗯,因为在第一次迭代中,“sum”应该是“0”。 - potashin
@potashin,你第一个片段中的等号是不必要的。 - sschmeck
这个赋值操作是多余的,你可以直接使用 + 代替 += - Stefan

2
这也可以使用(因为初始种子为0),但不符合所要求的使用reduce的方法。
@status.sum{|data| data['pending_increase'] - data['pending_decrease']}

这两个表达式是等价的,summap/reduce 更短更简单。
enum.sum{...} == enum.map{...}.reduce(0, :+)

2
sum 使用 inject,也叫做 reduce - Stefan

0
如果这是在Rails应用程序中,你可以这样做:
@status.map{|data| data['pending_increase'] - data['pending_decrease']}.sum

0
你可以先计算差异,然后将它们相加:
@status.map { |data| data['pending_increase'] - data['pending_decrease'] }.reduce(:+)

但这样做的缺点是会创建一个临时数组。

只是说一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接