3

我永远不记得它是否

array.inject{|memo,obj| block}

或者

array.inject{|obj,memo| block}

有没有人有记住顺序的好技巧?

4

4 回答 4

6

inject/reduce只不过是一个左折叠(因此在其他语言中称为foldl/ foldLeft),就是这样,元素与二元运算符的递归左关联组合:

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

因此,将累加器作为块的左/第一个参数传递是很自然的。在正确的折叠上,累加器将是正确的/第二个参数。

不是真正的助记符,但一旦你意识到这reduce是左弃牌,你就不会忘记累加器的去向。

于 2013-04-24T22:10:33.437 回答
2

它是 的反面each_with_object,我确实记得(首先是each,然后是object)。

于 2013-04-24T22:07:32.593 回答
1

如果你真的认为它在操纵 amemo和 anobject那么它是按字母顺序排列的:

array.inject{|memo,obj| block}

您的助记符是备忘录按字母顺序出现在对象之前。

于 2013-04-24T23:07:45.447 回答
0

当使用短块注入时,将参数命名为 |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

于 2013-04-24T22:05:30.163 回答