2013-04-24 44 views
3

我永遠記得,如果其記住如何調用紅寶石注入的助記符是什麼?

array.inject{|memo,obj| block} 

array.inject{|obj,memo| block} 

沒有人有記憶的順序一個很好的把戲?

+1

http://ruby-doc.org/core-2.0/Enumerable.html#method-i-inject? – 2013-04-24 22:04:11

+0

這也是激發[我的問題]的想法(http://stackoverflow.com/questions/16123680/switching-the-receiver-and-the-argument-of-enumerableinject)。 – sawa 2013-04-25 08:23:28

回答

6

inject/reduce不過是left fold(因此稱爲在其他語言foldl/foldLeft),就是這樣,用二元運算符元素的遞歸左結合組合:

(1..5).reduce(:+) == (((1 + 2) + 3) + 4) + 5 #=> true 
(1..5).reduce(:-) == (((1 - 2) - 3) - 4) - 5 #=> true 

所以這隻有當累加器作爲塊的左/第一個參數傳遞時纔是自然的。在右邊的fold中,累加器就是右/第二個參數。

不是一個真正的助記符,但一旦你意識到reduce是一個左邊的摺疊,你不會忘記累加器的位置。

0

當使用短塊注入時,將參數| a,e | (助記:蓄電池,元素)

不是很好,但它可以幫助我: 「備忘錄」 是第一位的(按字母順序),所以它是 注入(備忘錄,OBJ)

[1, 2, 3, 4, 5, 6].inject([]) do |result, elm| 
    result << elm * 2 if elm % 2 == 0 
    result 
end 
# => [4, 8, 12] 

那麼,什麼是該做的?用英文輸入是:

從某個對象(我們的空數組)開始,然後將我們調用者中的每個元素([1,2,3,4,5,6])傳遞給該塊。提供塊可以自由更改的結果對象。結果從我們的第一個參數(空數組)開始,然後變成塊最後評估的結果。

進一步詳情Here

2

這是each_with_object反轉,這一點我設法記住(第一each,那麼object)。

1

如果你真的認爲它操縱memoobject的則是按字母順序排列:

array.inject{|memo,obj| block} 

你的記憶是對象之前備忘錄來按字母順序。