gpt4 book ai didi

ruby-on-rails - 是否有任何额外的注入(inject)速记

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:58 24 4
gpt4 key购买 nike

我最近遇到了这个问题:
我一直这样使用注入(inject)(我知道 (0) 部分是可选的,可以省略)

array = [13,23,13]
#=> [13, 23, 13]
array.inject(0) { |sum,i| sum+i }
#=> 49

偶然发现你可以使用:

array.inject(:+)
#=> 49
array.inject(:-)
#=> -23
array.inject(:*)
#=> 3887
array.inject(:/)
#=> 0

谷歌搜索这个问题我发现了一个不错的 article on inject ,但没有提到我尝试过的东西....
任何人都可以向我解释或提供有关我刚刚使用的这些注入(inject)命令的一些信息吗?

最佳答案

来自 Enumerable#inject 上的文档:

... If you specify a symbol instead, then each element in the collection will be passed to the named method of memo. In either case, the result becomes the new value for memo. At the end of the iteration, the final value of memo is the return value for the method.

If you do not explicitly specify an initial value for memo, then uses the first element of collection is used as the initial value of memo.

因此,如果您指定一个符号,它会将其视为一个方法名称并在可枚举的每个元素上调用此方法,替换上面所述的 memo。现在,数学运算符 (+-*/) 只是方法,没有别的。这些行产生相同的结果:

13 + 23 # => 36
13.+(23) # => 36
13.send(:+, 23) # => 36

当您将符号传递给 injectreduce 时,它会使用第三种形式将该运算符动态应用于元素:

[1,2,3].inject(:+) # => 6

这个简写也可以用于运算符以外的方法:

[{"a"=>1}, {"b"=>2}].inject(:merge) # => {"a"=>1, "b"=>2} 

关于ruby-on-rails - 是否有任何额外的注入(inject)速记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com