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(&not_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/