2013-04-24 19 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} 

你的记忆是对象之前备忘录来按字母顺序。