software - ¿Cómo llamas al operador &: en Ruby?
ruby tutorial (1)
Posibles duplicados:
Ruby / Ruby on Rails y el acceso directo del colon
¿Qué significa map (&: name) en Ruby?
Estaba leyendo Stackoverflow y tropecé con el siguiente código
array.map(&:to_i)
Ok, es fácil ver qué hace este código, pero me gustaría saber más sobre &:
build que nunca he visto antes.
Lamentablemente, todo lo que puedo pensar es "lambda", que no es. Google me dice que la sintaxis lambda en Ruby es ->->(x,y){ x * y }
Entonces, ¿alguien sabe qué es ese misterioso y qué es y qué puede hacer, excepto llamar a un solo método?
Hay algunas piezas en movimiento aquí, pero el nombre de lo que está sucediendo es la conversión del Symbol#to_proc
. Esto es parte de Ruby 1.9 y posteriores, y también está disponible si usa versiones posteriores de Rails.
Primero, en Ruby :foo
significa "el símbolo foo
", por lo que en realidad se trata de dos operadores separados que está viendo, no un operador grande &:
Cuando dices foo.map(&bar)
, le estás diciendo a Ruby: "envía un mensaje al objeto foo
para invocar el método del map
, con un bloque que ya definí llamado bar
". Si la bar
ya no es un objeto Proc
, Ruby intentará convertirlo en uno.
Aquí, en realidad no pasamos un bloque, sino un símbolo llamado bar
. Debido a que tenemos una conversión to_proc
implícita disponible en Symbol
, Ruby lo ve y lo usa. Resulta que esta conversión se ve así:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
Esto proc
un proc
que invoca el método con el mismo nombre que el símbolo. Poniendo todo junto, usando su ejemplo original:
array.map(&:to_i)
Esto invoca .map
en una matriz, y para cada elemento en la matriz, devuelve el resultado de llamar to_i
en ese elemento.