我永远不记得它是否
array.inject{|memo,obj| block}
或者
array.inject{|obj,memo| block}
有没有人有记住顺序的好技巧?
inject
/reduce
只不过是一个左折叠(因此在其他语言中称为foldl
/ foldLeft
),就是这样,元素与二元运算符的递归左关联组合:
(1..5).reduce(:+) == (((1 + 2) + 3) + 4) + 5 #=> true
(1..5).reduce(:-) == (((1 - 2) - 3) - 4) - 5 #=> true
因此,将累加器作为块的左/第一个参数传递是很自然的。在正确的折叠上,累加器将是正确的/第二个参数。
不是真正的助记符,但一旦你意识到这reduce
是左弃牌,你就不会忘记累加器的去向。
它是 的反面each_with_object
,我确实记得(首先是each
,然后是object
)。
如果你真的认为它在操纵 amemo
和 anobject
那么它是按字母顺序排列的:
array.inject{|memo,obj| block}
您的助记符是备忘录按字母顺序出现在对象之前。
当使用短块注入时,将参数命名为 |a, e| (助记符:累加器,元素)
或者
不好,但它对我有帮助:“备忘录”首先出现(按字母顺序),所以它是 inject(memo, 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