2010-03-17 3 views
30

Ho un metodo che accetta un blocco di codice.Passaggio di più blocchi di codice come argomenti in Ruby

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

e mi chiamano in questo modo:

opportunity { @some_array.empty? }

Ma come faccio a passare più di un blocco di codice in modo che potessi usare rendimento due volte, qualcosa di simile:

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

e:

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

Sono consapevole che questo esempio potrebbe essere fatto senza rendimento, ma è solo per illustrare.

risposta

52

Non è possibile passare più blocchi, di per sé, ma è possibile passare più procs o lambda:

Uso 1.9 sintassi:

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

e nel metodo stesso:

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

È anche un altro modo per dichiarare che funzionano anche le funzioni – user5020

+1

Proc.new {} o lambda {}. Qualsiasi oggetto che risponde a 'call' funzionerà – Kylee

+0

Il metodo'.() 'Un alias di' .call'? – MrYoshiji