8

所以,我刚刚了解到,而不是写这样的东西:

[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

非常感谢!

4

1 回答 1

12

&在这种情况下,运算符将符号转换为过程。所以代码在后台执行此操作:

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

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

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

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

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

于 2013-05-17T09:27:00.867 回答