lua中函式可以作為全域性變數也可以作為區域性變數,我們已經看到一些例子:函式作為table的域(大部分lua標準庫使用這種機制來實現的比如io.read、math.sin)。這種情況下,必須注意函式和表語法:
1. 表和函式放在一起
lib = {}
lib.foo = function (x,y) return x + y end
lib.goo = function (x,y) return x - y end
2. 使用表建構函式
lib =
3. lua提供另一種語法方式
lib = {}
function lib.foo (x,y)
return x + y
end
function lib.goo (x,y)
return x - y
end
當我們將函式儲存在乙個區域性變數內時,我們得到乙個區域性函式,也就是說區域性函式像區域性變數一樣在一定範圍內有效。這種定義在包中是非常有用的:因為lua把chunk當作函式處理,在chunk內可以宣告區域性函式(僅僅在chunk內可見),詞法定界保證了包內的其他函式可以呼叫此函式。下面是宣告區域性函式的兩種方式:
1. 方式一
local f = function (...)
...end
local g = function (...)
...f() -- external local `f' is visible here
...end
2. 方式二
local function f (...)
...end
有一點需要注意的是在宣告遞迴區域性函式的方式:
local fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1) -- buggy
endend
上面這種方式導致lua編譯時遇到fact(n-1)並不知道他是區域性函式fact,lua會去查詢是否有這樣的全域性函式fact。為了解決這個問題我們必須在定義函式以前先宣告:
local fact
fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1)
endend
這樣在fact內部fact(n-1)呼叫是乙個區域性函式呼叫,執行時fact就可以獲取正確的值了。
但是lua擴充套件了他的語法使得可以在直接遞迴函式定義時使用兩種方式都可以。
在定義非直接遞迴區域性函式時要先宣告然後定義才可以:
local f, g -- `forward' declarations
function g ()
... f() ...
end
function f ()
... g() ...
end
原文:lua乙個小巧指令碼語言學習筆記
lua教程非全域性函式-22
Lua筆記10 非全域性函式
lua中函式可以作為全域性變數也可以作為區域性變數,我們已經看到一些例子 函式作為 table 的域 大部分 lua標準庫使用這種機制來實現的比如 io.read math.sin 這種情況下,必須注意函式和表語法 1.表和函式放在一起 lib lib.foo function x,y return...
C C 呼叫 Lua 函式(非全域性函式)
c c 呼叫 lua 函式有兩種 1,lua 指令碼裡,沒有local 修飾的函式,即為全域性函式 2,lua 指令碼裡,有local 修飾的函式,即為區域性函式 其實呼叫函式和取lua裡的變數是一樣的,網上講得最多的是呼叫全域性函式,這裡主要講呼叫非全域性函式 或是變數 如有指令碼 test.lu...
Lua初識之非全域性函式 十二
lua初識之非全域性函式 注意 在lua中呼叫乙個函式要在呼叫之前定義,否則出錯 表和函式放在一起 lib lib.foo function x,y return x y endlib.goo function x,y return x y endprint lib.foo 3,5 8 print ...