2009-11-24 9 views
5

Acabo de leer esta respuesta Converting upper-case string into title-case using Ruby.¿Qué es exactamente `&: capitalize` en Ruby?

Existe 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 sintaxis 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 syntax error, unexpected tAMPER.

+0

La razón por la que no funciona en irb para usted es probablemente porque, como dice sepp2k, solo se incluyó en la biblioteca estándar en Ruby 1.8.7, y supongo que está ejecutando una versión anterior. Sin embargo, lo ve con bastante frecuencia, porque ActiveSupport también lo arroja, y ActiveSupport viene con Rails. Si lo prueba en la secuencia de comandos/consola de Rails, probablemente descubra que funciona. –

+0

posible duplicado de [¿Qué significa map (&: name) en Ruby?] (Http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

Respuesta

6

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

foo(&not_a_proc_object) llama to_proc en not_a_proc_object y luego se vuelve el objeto devuelto por proc to_proc en un bloque y pide 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.