【发布时间】:2009-04-02 16:28:51
【问题描述】:
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
我正在查看此代码,但我的大脑并没有记录数字 10 是如何成为结果的。有人介意解释一下这里发生了什么吗?
【问题讨论】:
-
参见Wikipedia: Fold (higher-order function):inject 是“向左折叠”,尽管(不幸的是)在使用 Ruby 时经常会产生副作用。
-
如果您想消化比维基百科文章from this answer below更少的数学可视化。
-
我更喜欢#inject 的别名#reduce,因为这些操作是如何工作的。当您以一般方式使用#map 时,您将获得与“放入”#map 相同数量的元素,您将获得一对一的映射。使用#reduce,您会得到更少的 - 通常是 1 - 元素,因此命名为
reduce。当然,这是 Ruby,您可以调整 #map 和 #reduce 以使其行为不同。