LUA教程非全域性函式 22

2021-10-08 01:44:37 字數 1824 閱讀 2974

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 ...