2010-03-17 5 views
30

Ich habe eine Methode, die einen Codeblock nimmt.Mehrere Codeblöcke als Argumente in Ruby übergeben

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

und ich nenne es wie folgt aus:

opportunity { @some_array.empty? }

Aber wie gehe ich es mehr als ein Codeblock, so dass ich Ausbeute zweimal verwenden könnte, so etwas wie dieses:

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

und:

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

Ich bin mir bewusst, dass dieses Beispiel ohne Ausbeute gemacht werden könnte, aber es ist nur zur Veranschaulichung.

Antwort

52

Sie nicht mehrere Blöcke passieren kannst, per se, aber Sie mehrere Procs oder lambda passieren können:

Mit 1,9 Syntax:

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

und in der Methode selbst:

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

Ist es eine andere Möglichkeit zu erklären, dass die Funktionen – user5020

+1

Proc.new {} oder Lambda {} auch funktionieren. Jedes Objekt, das auf "call" antwortet, wird funktionieren – Kylee

+0

Ist die Methode '.()' Ein Alias ​​von '.call'? – MrYoshiji