[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
我在看这个代码,但我的大脑没有记录数字10是如何变成结果的.有人能解释一下这里发生了什么吗?
[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
在本例中,我们将累加器默认为空哈希,然后在每次执行块时填充它.注意,我们必须返回散列作为块的最后一行,因为块的结果将存储回累加器中.