Ruby试图掌握一种新的符号。 (注入(:)与选择(&:偶数?);为什么有&?)

所以,我刚学会了,而不是写下这样的东西:

[1,2,3,4,5].inject {|x,y| x + y} => 15 

我可以写

 [1,2,3,4,5].inject(:+) => 15 

我也学会了而不是写作

 [1,2,3,4,5].select {|x| x.even?} => [2,4] 

我可以写

 [1,2,3,4,5].select(&:even?) => [2,4] 

我的问题是为什么一个(选择)使用&而另一个(注入)不使用。 我确定:是因为even?+在符号处理,但我喜欢澄清为什么&在一个中使用以及为什么使用:

另外,我知道我可以做的不只是injectselect这些符号。

非常感谢!

在这种情况下, &运算符将符号转换为proc。 所以代码在幕后做了这个:

 [1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4] 

inject方法的实现认识到需要这些快捷方法规范,并在符号作为参数传递时添加特殊处理。 所以,在这种情况下,它基本上做了&运营商所做的事情。

为什么一个(选择)使用&而另一个(注入)不使用

因为没人实现select这种方式。 Ruby是开源的,甚至可以接受你的补丁。 去解决这个问题:)

PS:但是如果由我来决定,我会删除注入的特殊处理。 在Symbol#to_proc存在的情况下感觉有点多余和令人困惑(这就是&运营商使用的)。