2010-02-14 32 views
32

duplicados posibles:
Ruby/Ruby on Rails ampersand colon shortcut
What does map(&:name) mean in Ruby?¿Cómo se llama el operador &: en Ruby?

que estaba leyendo Stackoverflow y tropezamos con el siguiente código

array.map(&:to_i) 

Ok, es fácil ver lo que hace este código pero me gustaría saber más sobre &: construcción que nunca he visto antes.

Lamentablemente, todo lo que puedo pensar es "lambda", que no lo es. Google me dice que la sintaxis lambda en Ruby es ->->(x,y){ x * y }

¿Alguien sabe qué es ese misterioso &: y qué puede hacer excepto llamar a un solo método?

+10

Este es un duplicado exacto de * seis * preguntas diferentes. Y créame, Ruby no ha cambiado * tanto * en los últimos 8 días, por lo que las respuestas son * probablemente * las mismas: http://StackOverflow.Com/questions/99318/, http: // StackOverflow .Com/questions/1217088 /, http://StackOverflow.Com/questions/1792683/, http://StackOverflow.Com/questions/1961030/, http://StackOverflow.Com/questions/2096975/, http://StackOverflow.Com/questions/2211751/. –

+5

Claro, yo sé esto ahora. Pero cada nueva forma de redacción ayudará a la comunidad y a este sitio. Después de todo, * busqué * antes de preguntar. – vava

+4

@vava Esa es una razón * para no eliminar * la pregunta. Tu pregunta debería estar cerrada. –

Respuesta

61

Aquí hay algunas piezas móviles, pero el nombre de lo que está sucediendo es la conversión Symbol#to_proc. Esto es parte de Ruby 1.9 y posteriores, y también está disponible si usa versiones posteriores de Rails.

En primer lugar, en Ruby, :foo significa "el símbolo foo", por lo que es en realidad dos operadores independientes se encuentra en el mercado, no una gran &: operador.

Cuando dice foo.map(&bar), usted está diciendo a Ruby, "enviar un mensaje al objeto foo para invocar el método map, con un bloque ya definido denominado bar". Si bar no es un objeto Proc, Ruby intentará hacerlo uno.

Aquí, en realidad no pasamos un bloque, sino un símbolo llamado bar. Como tenemos una conversión implícita de to_proc disponible en Symbol, Ruby lo ve y lo usa. Resulta que esta conversión es el siguiente:

def to_proc 
    proc { |obj, *args| obj.send(self, *args) } 
end 

Esto hace un proc que invoca el método con el mismo nombre que el símbolo. Poniendo todo junto, la utilización de su original ejemplo:

array.map(&:to_i) 

Esto invoca .map en la matriz, y para cada elemento de la matriz, devuelve el resultado de la llamada to_i en ese elemento.

+7

mapa (&: to_i) es exactamente lo mismo que el mapa {| x | x.to_i}. Como el mapa requiere bloque y de ruby ​​1.9 en adelante, la conversión de Symbol to_proc está implícitamente disponible. – Abhaya

Cuestiones relacionadas