我有:
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?
答案 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)
启动您的代码。