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?
和+
在符号处理,但我喜欢澄清为什么&
在一个中使用以及为什么使用:
。
另外,我知道我可以做的不只是inject
和select
这些符号。
非常感谢!
在这种情况下, &
运算符将符号转换为proc。 所以代码在幕后做了这个:
[1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4]
inject
方法的实现认识到需要这些快捷方法规范,并在符号作为参数传递时添加特殊处理。 所以,在这种情况下,它基本上做了&
运营商所做的事情。
为什么一个(选择)使用&而另一个(注入)不使用
因为没人实现select
这种方式。 Ruby是开源的,甚至可以接受你的补丁。 去解决这个问题:)
PS:但是如果由我来决定,我会删除注入的特殊处理。 在Symbol#to_proc
存在的情况下感觉有点多余和令人困惑(这就是&
运营商使用的)。