變數是lua2.1中的基石,由於各變數的作用的不同,我們一般分為全域性變數和區域性變數,在lua2.1中也有這兩種變數,但是在其內部的
具體實現的卻很難讓人理解,本文主要來**lua2.1中全域性變數和區域性變數的具體實現細節。
與以往的分析不同,這次我們先來個例項。
b = 1;
function func1(c)
local d, d1;
local e;
e = 1;
a = 1;
return a;
end上面的lua語句得到的指令如下:
code
1 adjust 1
3 adjust 3
5 adjust 4
6 push1
7 storelocal3
8 push1
9 storeglobal 55
12 pushglobal 55
16 retcode 4
18 adjust 1
20 retcode 1
code
0 push1
1 storeglobal 50
4 retcode0
我們之後這個函式func1分析下來一共有四個區域性變數,第乙個區域性變數是在分析func的引數的時候得到的,伴隨這個變數的確定還有
一條指令是adjust 1來調整棧頂使得引數數量為1;第二和第三個區域性變數是在分析語句local d, d1的時候確定的,我們現在可以先
斷定乙個local關鍵字會帶來一調adjust指令,那麼時會有指令adjust 3。第四個和前面兩個一樣。那麼接著的a是區域性變數嗎?顯然
不是,因為它分析的結果是push1 storeglobal 55,說明它是全域性變數。好了,到目前為止我們知道有兩種情況可以使的乙個變數
成為區域性變數,第乙個是形參,第二個是被關鍵字local修飾過的變數。其它的**不離十是全域性變數。
下面我們考慮幾種情況:
情況1:使用乙個已有的全域性變數的名字作為區域性變數
b = 1;
function func1(c)
local b;
b = 2;
end指令:
code
1 adjust 1
3 adjust 2
4 push2
5 storelocal1
7 adjust 1
9 retcode 1
code
0 push1
1 storeglobal 50
4 retcode0
通過指令我們知道函式func1執行過後並不會修改全域性變數b的值。
情況2:將全域性變數作為引數傳入的時候
b = 1;
function func1(c)
c = 2;
endfunc1(b);
code
1 adjust 1
2 push2
3 storelocal0
5 retcode 1
指令:code
0 push1
1 storeglobal 50
4 pushglobal 52
7 pushglobal 50
10 callfunc 1 0
13 retcode0
通過指令我們知道func1使用的只是b的拷貝,所以函式中對引數c的修改並不能對b的值造成影響,
另外乙個原因是,如果想修改乙個全域性變數,那麼你必須使用storeglobal之類的指令才行,
storelocal系列的指令只會修改棧上的資料。
Lua 全域性變數和區域性變數
在lua中宣告乙個全域性變數很簡單 a 5直接賦值就可以,而且也不會限制變數的型別,我們可以直接把number型別的變數賦值string a hello 宣告乙個區域性變數需要在前面加上關鍵字 local local b 10區域性變數在當前 塊結束後就會銷毀 用do end命令建立乙個 塊 do ...
全域性變數和區域性變數
全域性變數 可以被不同的函式 類或檔案呼叫的變數,在函式外定義。區域性變數 只能在函式內使用,定義在函式內。區域性變數的使用 class myclass def myfun num 12 print myfun num num 正確 def myfun2 num num 1 print mufun ...
全域性變數和區域性變數
區域性變數 在方法中開闢的變數,只在方法中有效 區域性變數在定義時不會初始化,要顯式的給它乙個值 如未給它乙個初始值,雖然編譯的時候會通過,但是執行的時候會產生為初始化錯誤!方法呼叫 執行完,區域性變數便會自動釋放。在方法內的語句塊中建立的變數在編譯時假如未初始,如若使用,也會報未初始化錯誤!呼叫的...