在求和时,inject如何处理数组的第一个元素?

时间:2014-01-05 02:07:56

标签: ruby arrays inject

我有:

arr=[40, 50, 60, 70]

arr.inject do |sum,x|
  p x
  p sum
  if x>50
    sum=sum+x
  end
  p sum
end

为什么x从50开始,sum从40开始?我的猜测是x首先会超过40。更好的是,如何使用inject方法生成此语句,返回130?

2 个答案:

答案 0 :(得分:3)

Inject正在使用数组的第一个元素作为起始和,并从第二个元素开始执行块。您可以使用inject(0) do ..end将起始金额传递给注入。 然后它将以sum等于0开始,并从第一个元素执行块。另请注意,sum被分配给已执行块的值,因此您的代码根本不起作用。它应该是:

arr=[40, 50, 60, 70]

arr.inject do |sum,x|
  x > 50 ? sum+x : sum
end

但是我会写得稍微简单一些:

arr=[40, 50, 60, 70]

arr.select {|v| v > 50}.reduce(0, &:+)

如果您使用的是Active Support(来自Rails),您只需执行以下操作:

arr.select {|v| v > 50}.sum

答案 1 :(得分:2)

如果没有为inject方法提供参数,sum的值将是数组中第一个元素的值。如果您希望它为100,请使用arr.inject(100)启动您的代码。