從編程紅寶石摘自1.9書:爲什麼這種方法拉姆達的參數,它是如何工作的
def my_while(cond, &body)
while cond.call
body.call
end
end
a=0
my_while -> { a < 3 } do
puts a
a += 1
end
生產:
從編程紅寶石摘自1.9書:爲什麼這種方法拉姆達的參數,它是如何工作的
def my_while(cond, &body)
while cond.call
body.call
end
end
a=0
my_while -> { a < 3 } do
puts a
a += 1
end
生產:
的方法,期望的顯式參數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,除非後者的行爲是嚴格要求。除了更酷的兩個字符更短,其行爲並不令人驚訝。
該片-> { a < 3 }
是一個lambda術語的快捷方式(它是在wi紅寶石1.9)。這是傳遞給您的方法的第一個參數(即cond
),而之後的塊分配給body
。 lambda然後通過cond.call
在您的方法內執行。
所以拉姆達使用只是爲了能夠通過cond.call稱它爲方法內 –
是 - 第一個參數'cond'是明確的,並有望成爲「通知」,而'&block'是一個隱含參數,捕獲該方法的塊。 – emboss