Lua變量生命週期

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是就覺得有點摸不着頭腦了。

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章