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

Dav*_*vid 7 ruby syntax notation

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

[1,2,3,4,5].inject {|x,y| x + y} => 15
Run Code Online (Sandbox Code Playgroud)

我可以写

[1,2,3,4,5].inject(:+) => 15
Run Code Online (Sandbox Code Playgroud)

我也学会了而不是写作

[1,2,3,4,5].select {|x| x.even?} => [2,4]
Run Code Online (Sandbox Code Playgroud)

我可以写

[1,2,3,4,5].select(&:even?) => [2,4]
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么一个(选择)使用&而另一个(注入)不使用.我确信这:是因为even?并且+在符号处理,但是我想要澄清为什么&在一个:中使用以及为什么使用它.

另外,我知道我可以做的不只是injectselect.

非常感谢!

Ser*_*sev 10

&在这种情况下,运算符将符号转换为proc.因此代码在引擎盖下执行此操作:

[1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4]
Run Code Online (Sandbox Code Playgroud)

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

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

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

PS:但是如果由我来决定,我会取消注入的特殊处理.Symbol#to_proc(在&操作员使用的情况下)感觉有点多余和混乱.