Ruby中“&:capitalize”究竟是什么?
我刚刚阅读这个答案使用Ruby将大写string转换为标题大小写 。
有下面这行代码
"abc".split(/(\W)/).map(&:capitalize).join
究竟是什么&:capitalize
? 在我把它写入irb之前,我会告诉你,这不是有效的ruby语法。 它必须是某种Proc
对象,因为Array#map
通常需要一个块。 但事实并非如此。 如果我单独将它放入irb syntax error, unexpected tAMPER
。
foo(&a_proc_object)
把a_proc_object
变成一个块,然后用这个块调用foo。
foo(¬_a_proc_object)
在not_a_proc_object
上调用to_proc
,然后将由to_proc
返回的proc对象变成块,并调用foo与该块。
在ruby 1.8.7+和主动支持Symbol#to_proc
被定义为返回一个proc调用由proc参数上的符号命名的方法。
它的Symbol#to_proc
:见http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html
map(&:capitalize)
与map { |x| x.capitalize }
完全相同 map { |x| x.capitalize }
。
&符是语法糖,用to_proc
消息完成大量的代码生成。 见http://blog.codahale.com/2006/08/01/stupid-ruby-tricks-stringto_proc/