[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10我正在看这段代码,但我的大脑不知道数字10是如何变成结果的。有人能解释一下这里发生了什么吗?
发布于 2009-04-02 16:31:55
您可以将第一个块参数视为累加器:每次运行块的结果都存储在累加器中,然后传递给块的下一次执行。在上面显示的代码中,您将累加器result默认设置为0。该块的每次运行都会将给定数字与当前总数相加,然后将结果存储回累加器中。下一个块调用具有这个新值,将其相加,再次存储,然后重复。
在过程结束时,inject返回累加器,在本例中,累加器是数组中所有值的总和,即10。
下面是另一个从对象数组创建散列的简单示例,该数组以对象的字符串表示为关键字:
[1,"a",Object.new,:hi].inject({}) do |hash, item|
hash[item.to_s] = item
hash
end在本例中,我们默认将累加器设置为空哈希,然后在每次块执行时填充它。注意,我们必须返回散列作为块的最后一行,因为块的结果将被存储回累加器中。
发布于 2009-04-02 16:39:05
inject首先接受一个值(本例中的0 )和一个块,然后对列表中的每个元素运行一次该块。
result + element)。要解释这一点,最简单的方法可能是展示每个步骤是如何工作的,对于您的示例;这是一组虚构的步骤,展示了如何评估此结果:
[1, 2, 3, 4].inject(0) { |result, element| result + element }
[2, 3, 4].inject(0 + 1) { |result, element| result + element }
[3, 4].inject((0 + 1) + 2) { |result, element| result + element }
[4].inject(((0 + 1) + 2) + 3) { |result, element| result + element }
[].inject((((0 + 1) + 2) + 3) + 4) { |result, element| result + element }
(((0 + 1) + 2) + 3) + 4
10发布于 2009-04-02 16:32:12
代码遍历数组中的四个元素,并将前一个结果添加到当前元素中:
https://stackoverflow.com/questions/710501
复制相似问题