2012-12-12 51 views
6

我有困難的理解是什麼使以下行爲可能(從紅寶石鎬書所):LAMBDA行爲

def power_proc_generator 
    value = 1 
    lambda {value += value} 
end 

power_proc = power_proc_generator 

3.times {puts power_proc.call} # => 2,4,8 
3.times {puts power_proc_generator.call()} # => 2,2,2 

我沒有看到「power_proc」對象如何允許值繼續增加一倍我會假設(錯誤地看來)每個電話會重新分配值1.

我的問題是爲什麼「3.times {puts power_proc.call}」結果爲「2,4,8」而不是「2, 2,2「?

+0

試着說出你的問題是一個問題,所以沒有什麼困惑。 – knownasilya

+0

對不起,我用一個實際的問題澄清。 – Discorick

回答

5

power_proc_generator返回一個lambda,它使用(並修改)周圍範圍中變量的值。這被稱爲閉包 - 返回的函數「關閉」了變量value的值。因此,每次調用返回的函數時,它都會將value乘以兩。重要的部分是value停留在對power_proc.call的調用之間,因此您正在修改現有變量。

此外,闡述區別打印power_proc_generatorpower_proc.call之間 - power_proc_generator返回每個這就是所謂的時間一個新的功能,這就是爲什麼你永遠看不到value正在增加。另一方面,power_proc.call將繼續多次調用相同的函數。

+0

好吧,所以我認爲我的問題不僅僅是理解lambda表達式,更多的是關於不理解閉包,因此閉包承載最近的變量狀態,非對象函數調用將從頭開始重新計算。 – Discorick

2

power_proc_generator返回一個包含 的lambda包含變量'值'的閉包。所以變量掛起 從一個power_proc.call到下一個。