“怎么做?”;(1..4).注入(&;:&x2B;)”;在Ruby中工作

“怎么做?”;(1..4).注入(&;:&x2B;)”;在Ruby中工作,ruby,Ruby,我发现Ruby中的这段代码非常有趣 (1..4).inject(&:+) 好的,我知道inject做什么,我知道这段代码基本上等同于 (1..4).inject(0) {|a,n| a + n} 但它究竟是如何工作的呢 为什么&:+与编写块{| a,n | a+n}相同 为什么它不需要初始值?我同意初始值为0,但(1..4)。inject(&:*)也可以工作,并且初始值必须为1…来自: 如果改为指定符号,则集合中的每个元素都将传递给memo的命名方法 因此,指定符号相当于通过以下块:

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

(1..4).inject(&:+)
好的,我知道
inject
做什么,我知道这段代码基本上等同于

(1..4).inject(0) {|a,n| a + n}
但它究竟是如何工作的呢

为什么
&:+
与编写块
{| a,n | a+n}
相同

为什么它不需要初始值?我同意初始值为0,但
(1..4)。inject(&:*)
也可以工作,并且初始值必须为1…

来自:

如果改为指定符号,则集合中的每个元素都将传递给memo的命名方法

因此,指定符号相当于通过以下块:
{| memo,a | memo.send(sym,a)}

如果未明确指定备注的初始值,则使用集合的第一个元素作为备注的初始值

因此,Ruby没有什么神奇之处,它只是将第一个元素作为初始值,然后从第二个元素开始注入。您可以通过编写
[]来检查它。inject(:+)
:它返回
nil
,而不是
[])。inject(0,:+)
返回0


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

@tokland它基本上是相同的转换,但适用于任何方法,链接问题的顶部答案有一个很好的解释。这实际上是两个完全不同的问题,其中第一个问题是StackOverflow上已经提出并回答的至少11个其他问题的副本: