1. 程式人生 > >Lua程序設計之深入函數

Lua程序設計之深入函數

lua 程序設計 函數 閉合函數

先看一個函數:

function derivative(f,delta)

delta = delta or1e-4

return function(x)

return (f(x+delta)-f(x))/delta

end

end

對特定的函數f調用derivative(f)將(近似地)返回其導數,例如

c=derivative(math.sin)

print(math.cos(10),c(10)) --c(10)這樣的調用相當於derivative(math.sin)(10)

這個例子最讓我驚奇的是,10這個參數可以直接通過(10)的方式傳進去裏面嵌套的函數。


1. 閉合函數,closure

,就是一個函數加上該函數所需訪問的所有非局部的變量


2. 非局部的變量,就是在內部嵌套函數可以訪問的位於其外部嵌套環境中的局部變量,即不是全局變量也不是局部變量。即上面例子中的delta或者下面例子中的i。

例子:

Function newCounter()

local i= 0 –非局部變量

return function()

i= i+1

return i

end

c1 =newCounter() -- not c1 = newCounter,

Print(c1()) --1 相當於 newCounter()()

Print(c1()) --2 相當於 newCounter()()

由於創建變量i的函數(newCounter)已經返回,所以之後的每次調用每次調用匿名函數時,i都應是已經超出了作用範圍,但其實lua會以closure的概念來正確地處理這種情況。

在這裏,不禁要問,這裏的i是怎樣保存起來的,是類似於c++中的局部靜態變量嗎?

這裏有一個答案來自網上:對於閉合函數而言,屬於它的非局部變量,並不是在調用它的時候臨時產生的,而是和它一起存在的。所以每次調用閉合函數,非局部變量的值都不會被重置。

3. 閉合函數的應用(重定義函數):沙盒


4. 由於閉合函數的特殊,我們需要註意兩種情況:

a.非全局函數的調用順序(需要前向聲明嗎?)function func () … end的寫法只是一種語法糖,它相當於func = functionb.正確的尾調用。


本文出自 “FireKido的技術人生” 博客,請務必保留此出處http://zhangzhao.blog.51cto.com/12934593/1949995

Lua程序設計之深入函數