¿Qué es exactamente `&: capitalize` en Ruby?

Acabo de leer esta respuesta Convirtiendo una cadena en mayúscula en mayúscula usando Ruby .

Hay la siguiente línea de código

"abc".split(/(\W)/).map(&:capitalize).join 

¿Qué es exactamente &:capitalize ? Antes de haberlo contagiado, te hubiera dicho que no es una syntax de Ruby válida. Debe ser algún tipo de objeto Proc , porque Array#map normalmente toma un bloque. Pero no lo es. Si lo pongo en irb solo, obtengo un syntax error, unexpected tAMPER .

foo(&a_proc_object) convierte a a_proc_object en un bloque y llama a foo con ese bloque.

foo(&not_a_proc_object) llama a to_proc en not_a_proc_object y luego convierte el objeto proc devuelto por to_proc en un bloque y llama a foo con ese bloque.

En ruby ​​1.8.7+ y soporte activo Symbol#to_proc se define para devolver un proc que llama al método nombrado por el símbolo en el argumento para el proceso.

Es Symbol#to_proc : vea http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html

map(&:capitalize) es exactamente lo mismo que map { |x| x.capitalize } map { |x| x.capitalize } .

El ampersand es azúcar sintáctico que genera un montón de generación de código con el mensaje to_proc . Ver http://blog.codahale.com/2006/08/01/stupid-ruby-tricks-stringto_proc/