lua非全域性函式

工程師WWW發表於2014-03-03

我們知道,Lua的函式不僅可以儲存在全域性的變數中,還可以儲存在區域性變數或者table的欄位中(大部分的Lua庫都採用了此種機制, 例如io.read,math.sin).若要在Lua建立此種區域性函式,有方法如下:

方法1:使用常規的函式語法與table語法相結合來建立區域性函式:

1 Lib = {}
2  
3 Lib.foo = function (x, y)
4     return x+y
5 end
6  
7 Lib.goo = function (x,y)
8     return x- y
9 end

方法2:使用構造式來建立區域性函式:

1 Lib =
2 {
3     foo = function (x, y)
4         return x + y
5     end,
6     goo = function (x, y)
7         return x - y
8     end
9 }

方法3:另類的方法建立區域性函式

1 Lib = {}
2 function Lib.foo(x, y)
3     return x + y
4 end
5 function Lib.goo(x, y)
6     return x - y
7 end

上面的例子中建立區域性函式時都用到了table。下面看一些簡單的建立區域性函式的方法。 
我們知道只要
將一個函式儲存在一個區域性變數中,即可得到一個區域性函式(local function)。也就是說,該函式只能在特定的作用域使用。 
例如:

1 local f1= function(<引數>)
2     <函式體>
3 end
4  
5 local g1= function(<引數>)
6     <函式體>
7     f1()    --f1在這裡是可用的
8 end

上面的建立函式還有個更便捷的模式:

1 local function f(<引數>)
2     <函式體>
3 end

在建立區域性函式的時候,要明確其所在的作用域,看例子:

1 local fun = function(x)
2     if 0 == n then
3         return 1
4     else
5         return n*fun(n-1)    --error,在呼叫時,編譯器會直接先呼叫fun的全域性函式。
6     end
7 end

上面的fun是個區域性函式,在呼叫fun(n - 1)時未定義,所以這裡是直接呼叫全域性的fun函式,而不是上面我們定義的區域性函式fun.。解決這個問題的辦法是,先定義一個區域性變數,再定義函式本身

1 local fun        --這裡先定義個區域性變數
2 fun = function(x)        --然後將函式賦值給區域性變數,使其成為一個區域性函式
3     if 0 == n then
4         return 1
5     else
6         return n*fun(n - 1)
7     end
8 end

為什麼上面的程式碼就不出錯,因為對於區域性函式的定義:

1 local function fun(<引數>)
2     <函式體>
3 end

Lua在執行時將它展開為:

1 local fun
2 fun = function(<引數>)
3     <函式體>
4 end

因此,針對上面的出錯的函式,可以這麼寫:

1 local function fun(n)    --這裡直接建立了區域性函式
2     if n == 0 then
3         return 1
4     else
5         return n*fun(n-1)
6     end
7 end

總結一句:建立區域性函式的方法有上面那麼幾種,但是,個人感覺只需要記住下面最保守的這種即可:

1 local function fun(n)    --這裡直接建立了區域性函式
2     if n == 0 then
3         return 1
4     else
5         return n*fun(n-1)
6     end
7 end

即在函式的定義中加個local識別符號

嗯,區域性函式的定義建立就寫到這裡為止。

相關文章