【发布时间】:2014-01-22 15:08:17
【问题描述】:
我有:
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?
【问题讨论】:
我有:
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?
【问题讨论】:
Inject 使用数组的第一个元素作为起始和,并从第二个元素开始执行块。您可以使用inject(0) do ..end 传递起始金额以进行注入。
然后它将以等于 0 的sum 开始,并从第一个元素开始执行块。另请注意,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
【讨论】:
如果您不为inject 方法提供参数,sum 的值将是数组中第一个元素的值。如果您希望它为 100,请以 arr.inject(100) 开头。
【讨论】: