2010-03-17 70 views
30

我有一個需要代碼塊的方法。在Ruby中傳遞多個代碼塊作爲參數

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

,我這樣稱呼它:

opportunity { @some_array.empty? }

但我怎麼把它傳遞不止一個代碼塊,這樣我可以用產量的兩倍,這樣的事情:

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

和:

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

我知道這個例子可以在沒有收益的情況下完成,但這只是爲了說明。

回答

52

您無法通過多個塊本身,但是你可以通過多種特效或lambda表達式:

使用1.9語法:

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

和方法本身:

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

是否聲明函數 – user5020 2015-05-07 19:11:54

+1

Proc.new {}或lambda {}也有效。任何響應'call'的對象都可以工作 – Kylee 2015-09-08 16:35:55

+0

方法'。()'.call'的別名? – MrYoshiji 2015-11-24 19:50:57