2010-03-17 12 views
30

Tengo un método que toma un bloque de código.Pasar múltiples bloques de código como argumentos en Ruby

def opportunity 
    @opportunities += 1 
    if yield 
    @performances +=1 
    end 
end 

y yo lo llaman así:

opportunity { @some_array.empty? }

Pero, ¿cómo lo paso más de un bloque de código para que pudiera usar un rendimiento dos veces, algo como esto:

def opportunity 
    if yield_1 
    @opportunities += 1 
    end 
    if yield_2 
    @performances +=1 
    end 
end 

y:

opportunity {@some_other_array.empty?} { @some_array.empty? } 

Soy consciente de que este ejemplo podría realizarse sin rendimiento, pero es solo para ilustrar.

Respuesta

52

No se puede pasar varios bloques, per se, pero se puede pasar múltiples procs o lambdas:

Uso de 1,9 sintaxis:

opportunity ->{ @some_array.empty? }, ->{ @some_other_array.empty? } 

y en el propio método:

def opportunity(lambda1, lambda2) 
    if lambda1.() 
    @opportunities += 1 
    end 
    if lambda2.() 
    @performances += 1 
    end 
end 
+0

Es otra forma de declarar que las funciones – user5020

+1

Proc.new {} o lambda {} también funcionan. Cualquier objeto que responda a 'call' funcionará – Kylee

+0

¿El método'.() 'Es un alias de' .call'? – MrYoshiji

Cuestiones relacionadas