2011-12-17 41 views
1

我正在閱讀'ruby編程語言',並且遇到以下代碼片段。將多個參數傳遞給一個塊

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

據我所知,x包含一個元素從一個將要傳遞給博克但「和」部分是混淆了我,那是某種運算符或函數的還是它就像X另一個變量。我知道x變量可以被稱爲f或v,但是如果是這種情況,ruby如何知道x是將該元素傳遞給迭代器的變量,那麼它可以輕鬆地將該變量傳遞給sum(如果它甚至是一個變量)。

我希望這是有道理的,因爲我總是發現它不得不把我的困惑放到作品中,好像我更好地理解了問題的本質,我更願意找到我自己的解決方案。

謝謝!

回答

7

總和是累加器對象,例如下面的代碼:

(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 

可以給累加器對象中的任何有效的變量名的在上下文中使用有意義的名稱更好。

+0

那麼在我的例子中紅寶石怎麼知道給x的值,是因爲它在列表中的最後一位,還是因爲sum是某種關鍵字?會'' x,sum |'也一樣嗎? – 2011-12-17 17:12:00

+0

好吧(只是爲了讓它在我的小腦子裏),如果我這樣做'| a,b,c,val |'那麼a,b和c就是我在塊和val中使用的變量,因爲它最後被命名爲迭代器將不同值傳遞給每個塊的地方 – 2011-12-17 17:20:34

+0

aaah,很好,所以迭代器定義了它期望的變量,清除了所有的東西!非常感激! – 2011-12-17 17:46:30

0

sum只是一個參數的名稱 - 它絕對沒有魔法。你可以選擇任何的叫法,例如:

a.inject do | accumulator, el | 
    accumulator + el 
end 

會做同樣的事情。

inject只是遍歷accumulator的元素,併爲a的每個元素執行給定的塊。這裏重要的是,每次迭代的結果都可以在accumulator的下一次迭代中使用。最後一次迭代的結果成爲整個調用的結果。