我永远不会记得它的
array.inject{|memo,obj| block}
或
array.inject{|obj,memo| block}
有没有人有记住订单的好方法?
答案 0 :(得分: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
因此,累加器作为块的左/第一个参数传递是很自然的。在右侧折叠处,累加器将是正确/第二个参数。
不是真正的助记符,但是一旦你意识到reduce
是左折,你就不会忘记累加器的去向。
答案 1 :(得分:2)
它与each_with_object
相反,我确实记得(首先是each
,然后是object
)。
答案 2 :(得分:1)
如果你真的认为它操纵了memo
和object
那么它就是按字母顺序排列的:
array.inject{|memo,obj| block}
你的助记符是备忘录按字母顺序出现在对象之前。
答案 3 :(得分: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