[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

我在看这个代码,但我的大脑没有记录数字10是如何变成结果的.有人能解释一下这里发生了什么吗?

推荐答案

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

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

下面是另一个简单的示例,用于从对象数组中创建哈希,该数组由对象的字符串表示形式设置关键字:

[1,"a",Object.new,:hi].inject({}) do |hash, item|
  hash[item.to_s] = item
  hash
end

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

Ruby相关问答推荐

Sinatra 与 EventMachine WebSockets 一起工作是否成功?

获取字符串中的最后一个字符

由模块中定义的另一个覆盖方法

如何使用 Ruby 的邮件 gem 通过 smtp 发送Electron邮件?

如何判断 Ruby 数组是否包含多个值之一?

为什么 Matz Select 在 Ruby 中默认使字符串可变?

如何通过反射获取 Ruby 的 Module 类定义的常量?

按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

如何让 Ruby 解析时间,就好像它在不同的时区一样?

如何从最后一个元素开始遍历数组?

try 学习/理解 Ruby 的 setter 和 getter 方法

用零填充数字

在Ruby中第一个=符号之后获取子字符串

无法对 ruby​​ 哈希使用点语法

使用哈希参数进行 DRY Ruby 初始化

HAML 中 Javascript 中的 Ruby 方法

将 CSV 文件转换为哈希数组

如何在 Rails 3 迁移中描述枚举列?

如何使用 Ruby 的 self 关键字

将哈希传递给函数 ( *args ) 及其含义