¿Cómo llamas al operador &: en Ruby?

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 syntax 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.