您好,登錄后才能下訂單哦!
先看一個函數(shù):
function derivative(f,delta)
delta = delta or1e-4
return function(x)
return (f(x+delta)-f(x))/delta
end
end
對特定的函數(shù)f調(diào)用derivative(f)將(近似地)返回其導(dǎo)數(shù),例如
c=derivative(math.sin)
print(math.cos(10),c(10)) --c(10)這樣的調(diào)用相當(dāng)于derivative(math.sin)(10)
這個例子最讓我驚奇的是,10這個參數(shù)可以直接通過(10)的方式傳進(jìn)去里面嵌套的函數(shù)。
1. 閉合函數(shù),closure,就是一個函數(shù)加上該函數(shù)所需訪問的所有“非局部的變量”。
2. 非局部的變量,就是在內(nèi)部嵌套函數(shù)可以訪問的位于其外部嵌套環(huán)境中的局部變量,即不是全局變量也不是局部變量。即上面例子中的delta或者下面例子中的i。
例子:
Function newCounter()
local i= 0 –非局部變量
return function()
i= i+1
return i
end
c1 =newCounter() -- not c1 = newCounter,
Print(c1()) --1 相當(dāng)于 newCounter()()
Print(c1()) --2 相當(dāng)于 newCounter()()
由于創(chuàng)建變量i的函數(shù)(newCounter)已經(jīng)返回,所以之后的每次調(diào)用每次調(diào)用匿名函數(shù)時,i都應(yīng)是已經(jīng)超出了作用范圍,但其實lua會以closure的概念來正確地處理這種情況。
在這里,不禁要問,這里的i是怎樣保存起來的,是類似于c++中的局部靜態(tài)變量嗎?
這里有一個答案來自網(wǎng)上:對于閉合函數(shù)而言,屬于它的非局部變量,并不是在調(diào)用它的時候臨時產(chǎn)生的,而是和它一起存在的。所以每次調(diào)用閉合函數(shù),非局部變量的值都不會被重置。
3. 閉合函數(shù)的應(yīng)用(重定義函數(shù)):沙盒
4. 由于閉合函數(shù)的特殊,我們需要注意兩種情況:a.非全局函數(shù)的調(diào)用順序(需要前向聲明嗎?),function func () … end的寫法只是一種語法糖,它相當(dāng)于func = function。b.正確的尾調(diào)用。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。