Lua變量的定義是很自由的,不需要像C語言那樣必須指明類型,變量可以是任何“值”,比較特殊的一點是,可以把任何function賦值給變量,如:
var = function()print("something") end
如果不再需要某個變量,可以直接把它置爲nil,垃圾回收機制會負責把變量刪除。
Lua默認所有變量都爲全局變量,並且Lua會將所有的全局變量放到一個名爲_G的普通表中。如果僅僅需要在某個局部使用變量的話,需要在變量前加local:
do
local var
end
如果在local變量的前後加do和end會認爲中間的語句在一個chunk內,出了這個chunk,內部所有的local變量將失效。(chunk是Lua執行的最小單位)
值得注意的是Lua用一個名爲environment普通的表來保存所有的全局變量。(更精確的說,Lua在一系列的environment中保存他的“global”變量,但是我們有時候可以忽略這種多樣性)這種結果的優點之一是他簡化了Lua的內部實現,因爲對於所有的全局變量沒有必要非要有不同的數據結構。另一個(主要的)優點是我們可以像其他表一樣操作這個保存全局變量的表。爲了簡化操作,Lua將環境本身存儲在一個全局變量_G中。
假設有如下兩個函數
function a()
var= 1;
return var;
end;
function b()
return var
end;
print( a());
print( b());
得到的結果爲:
1
1
這樣還看起來好像沒有什麼問題;
但如果有下面的c代碼
lua_State* pLua;
void InitLua()
{
pLua = luaL_newstate();
}
int a()
{
lua_getglobal(m_pL, "a");
lua_pcall(m_pL, 0, 1, 0)
int temp = lua_tointeger( pLua,-1);
return temp;
}
int b()
{
lua_getglobal(m_pL, "b");
lua_pcall(m_pL, 0, 1, 0)
int temp = lua_tointeger( pLua,-1);
return temp;
}
int main()
{
InitLua();
a();
printf( “%d”, b());
return 1;
}
輸出爲:1
如果調用函數a和函數b的代碼隔個比較遠的話,可能當函數b返回1是就覺得有點摸不着頭腦了。