Comprensión de .each (&: my_method)

Posible duplicado:
¿Qué significa map (&: name) en Ruby?

Estaba viendo un railscast y vi este código.

[Category, Product].(&:delete_all) 

En lo que respecta a la limpieza de una base de datos.

Pregunté sobre la línea en IRC y me dijeron

 (&:delete_all) 

era un atajo para

 {|model| model.delete_all} 

Probé esto con lo siguiente

 class ClassOne def class_method puts 1 end end class ClassTwo def class_method puts 2 end end [ClassOne, ClassTwo].each(&:class_method) 

Recibí un error que decía

 Wrong Argument type Symbol (expected Proc) 

También intenté

 one = ClassOne.new two = ClassTwo.new [one, two].each(&:class_method) 

Pero eso todavía falló.

Si lo modifiqué para leer

 [one, two].each{|model| model.class_method} 

Todo funcionó como se esperaba.

Entonces, ¿qué hace &:delete_all realidad? Los documentos dicen que delete_all es un método, por lo que estoy confundido en cuanto a lo que está sucediendo aquí.

Esto se basa en una extensión de Ruby 1.9 que se puede hacer en 1.8 incluyendo lo siguiente:

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

Creo que Rails define esto en ActiveSupport .

Es un parche específico de Rails de Ruby, símbolo de proc .