我永远记得,如果其记住如何调用红宝石注入的助记符是什么?
array.inject{|memo,obj| block}
或
array.inject{|obj,memo| block}
没有人有记忆的顺序一个很好的把戏?
我永远记得,如果其记住如何调用红宝石注入的助记符是什么?
array.inject{|memo,obj| block}
或
array.inject{|obj,memo| block}
没有人有记忆的顺序一个很好的把戏?
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
是一个左边的折叠,你不会忘记累加器的位置。
当使用短块注入时,将参数| 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
这是each_with_object
反转,这一点我设法记住(第一each
,那么object
)。
如果你真的认为它操纵memo
和object
的则是按字母顺序排列:
array.inject{|memo,obj| block}
你的记忆是对象之前备忘录来按字母顺序。
http://ruby-doc.org/core-2.0/Enumerable.html#method-i-inject? – 2013-04-24 22:04:11
这也是激发[我的问题]的想法(http://stackoverflow.com/questions/16123680/switching-the-receiver-and-the-argument-of-enumerableinject)。 – sawa 2013-04-25 08:23:28