2011-08-04 42 views

回答

4

的方法,期望的顯式參數cond,並且該「狀態」被假定爲一個lambda/PROC(假設是通過依靠cond.call成功製造),並已被傳遞給方法my_while明確。 &語法通過將其隱式轉換爲一個Proc對象(see 'The ampersand')來捕獲變量中的方法塊(如果存在)。

塊不是Ruby中的真實對象,因此必須使用&符號語法進行轉換。一旦塊被綁定到一個Proc,你可以像在任何其他proc/lambda上一樣發送call消息。

->語法是lambda的簡寫,它將塊轉換爲Proc對象(顯式地)。使用lambda和Proc.new也有一點區別。再次,wikibook:

實際上,lambda和Proc.new之間有兩個細微的差異。

首先,參數檢查。用於lambda狀態的Ruby文檔:等同於Proc.new,除了生成的Proc對象檢查調用時傳遞的參數數量。

其次,從Proc處理退貨的方式有所不同。從Proc.new的返回從封閉方法返回(作用就像從一個塊的返回,更稍後):

def try_ret_procnew 
    ret = Proc.new { return "Baaam" } 
    ret.call 
    "This is not reached" 
end 

# prints "Baaam" 
puts try_ret_procnew 

雖然從拉姆達返回作用更常規地,返回到它的調用者:光

def try_ret_lambda 
    ret = lambda { return "Baaam" } 
    ret.call 
    "This is printed" 
end 

# prints "This is printed" 
puts try_ret_lambda 

有了這個,我會建議使用lambda代替Proc.new,除非後者的行爲是嚴格要求。除了更酷的兩個字符更短,其行爲並不令人驚訝。

+0

所以拉姆達使用只是爲了能夠通過cond.call稱它爲方法內 –

+1

是 - 第一個參數'cond'是明確的,並有望成爲「通知」,而'&block'是一個隱含參數,捕獲該方法的塊。 – emboss

2

該片-> { a < 3 }是一個lambda術語的快捷方式(它是在wi紅寶石1.9)。這是傳遞給您的方法的第一個參數(即cond),而之後的塊分配給body。 lambda然後通過cond.call在您的方法內執行。