2008-09-19 10 views
12

Duplicar posible:
What does map(&:name) mean in Ruby?entendimiento [ClassOne, ClassTwo] .Cada (Y: mi_metodo)

estaba viendo un Railscast y vio este código.

[Category, Product].(&:delete_all) 

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

me preguntó acerca de la línea de IRC y me dijeron

(&:delete_all) 

era un atajo para

{|model| model.delete_all} 

He probado esto con la siguiente

class ClassOne 
    def class_method 
    puts 1 
    end 
end 

class ClassTwo 
    def class_method 
    puts 2 
    end 
end 

[ClassOne, ClassTwo].each(&:class_method) 

he recibido un error que dice

Wrong Argument type Symbol (expected Proc) 

También probé

one = ClassOne.new 
two = ClassTwo.new 

[one, two].each(&:class_method) 

Pero eso fracasaron.

Si lo modificó para leer

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

Todo ha funcionado como se esperaba.

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

Respuesta

20

Este se basa en un Ruby 1.9 extensión que se puede hacer en 1,8 mediante la inclusión de los siguientes:

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

Creo Rails define esta en ActiveSupport.

+0

Esto es correcto; Si ejecutó su prueba en IRB, no funcionaría (suponiendo que ejecute Ruby 1.8.x). Inténtalo de nuevo en script/consola. –

3

Es un parche específico de Rails de Ruby, symbol to proc.

+0

Esta respuesta solía ser cierta, pero Ruby 1.8.6 y versiones anteriores son verdaderamente heredadas ahora. –