【问题标题】:are there any additional inject shorthand有没有额外的注入速记
【发布时间】:2013-01-25 16:40:32
【问题描述】:

我最近遇到了这个问题:
我一直这样使用注入(我知道 (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,但没有提及我尝试过的内容....
任何人都可以向我解释或提供一些关于我刚刚使用的这些注入命令的信息吗?

【问题讨论】:

  • 另一种简写形式是sum 方法或reduce

标签: ruby-on-rails ruby


【解决方案1】:

来自Enumerable#inject上的文档:

... 如果你指定了一个符号,那么集合中的每个元素都将被传递给 memo 的命名方法。无论哪种情况,结果都会成为 memo 的新值。在迭代结束时,memo 的最终值就是方法的返回值。

如果没有显式指定memo的初始值,则使用collection的第一个元素作为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} 

【讨论】:

  • 我编辑了您的答案以反映符号语法不仅限于运算符,还可以与其他方法一起使用,因为这对原始问题似乎很重要。希望您不要介意编辑!
猜你喜欢
  • 2021-08-20
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多