【问题标题】:How does "(1..4).inject(&:+)" work in Ruby"(1..4).inject(&:+)" 如何在 Ruby 中工作
【发布时间】:2011-06-27 13:23:39
【问题描述】:

我发现这段 Ruby 代码非常有趣

(1..4).inject(&:+)

好的,我知道inject做了什么,而且我知道这段代码基本上相当于

(1..4).inject(0) {|a,n| a + n}

但它究竟是如何工作的呢?

为什么&:+和写块{|a,n| a + n}是一样的?

为什么它不需要初始值?我可以接受初始值为 0,但 (1..4).inject(&:*) 也可以,初始值必须为 1...

【问题讨论】:

标签: ruby


【解决方案1】:

来自Ruby documentation

如果你指定了一个符号,那么集合中的每个元素都会被传递给 memo 的命名方法

因此,指定符号等同于传递以下块: {|memo, a| memo.send(sym, a)}

如果没有显式指定memo的初始值,则使用collection的第一个元素作为memo的初始值。

所以,没有魔法,Ruby 只是将第一个元素作为初始值,然后从第二个元素开始注入。你可以写[].inject(:+)来检查它:它返回nil,而不是[].inject(0, :+),它返回0。

编辑:我没有注意到与号。您不需要它,inject 将使用符号。但是如果你写了,符号会被转换为块,它可以与other methods一起使用

【讨论】:

  • @tokland 这基本上是相同的转换,但适用于任何方法,链接问题的最佳答案有很好的解释。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2014-11-26
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多