我正在阅读'红宝石编程语言'并且遇到了以下代码。
a.inject do | sum, x |
sum + x
end
我知道x包含一个将传递给bock的元素但是'sum'部分让我困惑,它是某种运算符或函数还是只是另一个像x的变量。我理解x变量可以被称为f,或者v,但是如果是这样的话,ruby知道x是那个将元素传递给迭代器的变量,那么它可以很容易地将变量传递给sum(如果它甚至是变数)。
我希望这是有道理的,因为我总是发现它必须把我的困惑放到工作中,好像我更好地理解问题的本质,我会更有可能找到我自己的解决方案。
谢谢!
答案 0 :(得分:7)
sum是累加器对象,例如以下代码:
(1..10).inject(0) do |sum, num| #sum is initialized to 0 and passed in as the accumulator
sum + num #since sum is the accumulator, the result of this addition is stored in sum
end
以上代码与:
相同sum = 0
(1..10).each do
|num|
sum = sum + num
end
您可以为累加器对象提供任何有效的变量名称,当然最好在上下文中使用有意义的名称。
答案 1 :(得分:0)
sum
只是一个参数的名称 - 它绝对没有魔力。您可以为其选择任何名称,例如:
a.inject do | accumulator, el |
accumulator + el
end
会做同样的事情。
inject
只是遍历accumulator
的元素,并为a
的每个元素执行给定的块。重要的是,每次迭代的结果都可以作为accumulator
进行下一次迭代。最后一次迭代的结果成为整个inject
调用的结果。