首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要简单地解释一下inject方法

我需要简单地解释一下inject方法
EN

Stack Overflow用户
提问于 2009-04-03 00:28:51
回答 17查看 64.6K关注 0票数 146
代码语言:javascript
复制
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

我正在看这段代码,但我的大脑不知道数字10是如何变成结果的。有人能解释一下这里发生了什么吗?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-04-02 16:31:55

您可以将第一个块参数视为累加器:每次运行块的结果都存储在累加器中,然后传递给块的下一次执行。在上面显示的代码中,您将累加器result默认设置为0。该块的每次运行都会将给定数字与当前总数相加,然后将结果存储回累加器中。下一个块调用具有这个新值,将其相加,再次存储,然后重复。

在过程结束时,inject返回累加器,在本例中,累加器是数组中所有值的总和,即10。

下面是另一个从对象数组创建散列的简单示例,该数组以对象的字符串表示为关键字:

代码语言:javascript
复制
[1,"a",Object.new,:hi].inject({}) do |hash, item|
  hash[item.to_s] = item
  hash
end

在本例中,我们默认将累加器设置为空哈希,然后在每次块执行时填充它。注意,我们必须返回散列作为块的最后一行,因为块的结果将被存储回累加器中。

票数 213
EN

Stack Overflow用户

发布于 2009-04-02 16:39:05

inject首先接受一个值(本例中的0 )和一个块,然后对列表中的每个元素运行一次该块。

  1. 在第一次迭代时,它传入您提供的作为起始值的值和列表的第一个元素,并保存您的块返回的值(在本例中为result + element)。
  2. 然后再次运行该块,将第一次迭代的结果作为第一个参数传入,并将列表中的第二个元素作为第二个参数传入,再次保存结果。
  3. 它继续这样操作,直到它使用完列表中的所有元素。

要解释这一点,最简单的方法可能是展示每个步骤是如何工作的,对于您的示例;这是一组虚构的步骤,展示了如何评估此结果:

代码语言:javascript
复制
[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
票数 88
EN

Stack Overflow用户

发布于 2009-04-02 16:32:12

代码遍历数组中的四个元素,并将前一个结果添加到当前元素中:

  • 1 +2= 3
  • 3 +3= 6
  • 6 +4= 10
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/710501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档