将多个参数传递给块

时间:2011-12-17 16:57:17

标签: ruby

我正在阅读'红宝石编程语言'并且遇到了以下代码。

a.inject do | sum, x |
    sum + x
end

我知道x包含一个将传递给bock的元素但是'sum'部分让我困惑,它是某种运算符或函数还是只是另一个像x的变量。我理解x变量可以被称为f,或者v,但是如果是这样的话,ruby知道x是那个将元素传递给迭代器的变量,那么它可以很容易地将变量传递给sum(如果它甚至是变数)。

我希望这是有道理的,因为我总是发现它必须把我的困惑放到工作中,好像我更好地理解问题的本质,我会更有可能找到我自己的解决方案。

谢谢!

2 个答案:

答案 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调用的结果。