2010-03-17 6 views
30

J'ai une méthode qui prend un bloc de code.Passage de plusieurs blocs de code comme arguments dans Ruby

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

et je l'appelle comme ceci:

opportunity { @some_array.empty? }

Mais comment puis-je passer plus d'un bloc de code pour que je puisse utiliser le rendement deux fois, quelque chose comme ceci:

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

et:

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

Je suis conscient que cet exemple pourrait être fait sans rendement, mais c'est juste pour illustrer.

Répondre

52

Vous ne pouvez pas passer plusieurs blocs, en soi, mais vous pouvez passer plusieurs procs ou lambdas:

Utilisation 1.9 Syntaxe:

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

et dans la méthode elle-même:

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

Est-ce un autre moyen de déclarer que les fonctions – user5020

+1

Proc.new {} ou lambda {} fonctionnent également. Tout objet qui répond à 'call' fonctionnera – Kylee

+0

Est-ce que la méthode'.() 'Est un alias de' .call'? – MrYoshiji

Questions connexes