lua函式之搜尋變數

2021-08-27 14:21:15 字數 653 閱讀 7812

lua中的每個函式會被lua虛擬機器解析儲存在funcstate結構體中(乙個lua檔案本身也會對應乙個funcstate結構),每個funcstate有乙個prev指標指向它的父函式(最高層是某個lua檔案,即全域性環境,改層的prev指標為null)。

lua的變數分三種型別:全域性變數、區域性變數和upvalue。

有了以上的認識之後,我們來看看lua函式是怎麼獲取它需要用到的變數,以一下**為例:

a = 1

function func()

local b = 2

function test()

local c = 3

print(c + b + a)

endreturn test()

endf = func()

f()

查詢c:在test的環境中查詢到c,因此c是區域性變數

查詢b:在test的環境中無法查詢到b,則通過prev指標進入它的父函式func中查詢,查詢成功,因此b為upvalue

查詢a:在test的環境中無法查詢到a,則通過prev指標進入它的父函式func中查詢,查詢失敗,則繼續通過func的prev指標進入全域性環境中查詢,找到a,因此a是全域性變數

從以上的過程看,使用lua時適當的優先使用區域性變數可以提高程式效率。

xLua C 訪問Lua之訪問Lua的變數

在resources資料夾中新建乙個csharpcalllua.lua.txt檔案,定義幾個變數 i 10 str wwz isstu false void start lua的number型別對於c 的int,float,double的,如果型別不對,會返回0比如在lua中i 10.1,c 中in...

Lua學習之閉合函式

閉合函式 closure 看lua程式設定這本書的時候,其實感覺也就lua也就那樣,直到看到閉合函式這乙個塊 首先來說說函式,函式在lua中屬於第一類值,其實對於函式而言,function a end 和 a function end 是等價的,乙個函式的定義實際上就是一條賦值語句,這條語句首先建立...

Lua資料之函式(特殊)

區域性函式 由於全域性變數一般會汙染全域性名字空間,同時也有效能損耗 即查詢全域性環境表的開銷 因此我們應當盡量使用 區域性函式 其記法是類似的,只是開頭加上 local 修飾符 local function function name arc body end由於函式定義等價於變數賦值,我們也可以...