LUA-2 lua中的全局(global)


lua中有一個全局的表,_G,這個表包含了所有的全局變量.

例如:

a = 123;

d = {a,444};

這樣的兩個變量實際上就會被lua存儲到_G表中去.也就是說_G["a"]就是變量a.

_G["a"] = _G["d"];這樣的語句和a=d;是完全一樣的.當然,既然_G也是一個表,那么我們就可以設置_G表的__index等函數來達到控制_G表的訪問權限了.當然我們也可以用__newindex來防止創建新的全局變量(至於怎么做:只要在函數里調用error()函數來輸出一個錯誤就行了,這樣就可以避免創建新的全局變量,但是一般沒必要這么做,當然是用rawget和rowset依舊有效).

正因為全局,所以有時候我們可能會不經意間就覆蓋了別的全局變量導致錯誤,因此是用setfenv()函數可以改變這個情況.

setfenv()可以改變全局表.也就是說,默認的全局表是_G,我們可以新創建一個表,並把這個表作為新的全局表,那么之后創建的全局變量都會存在於這個新的表中(之前的全局數據依舊在_G中).

a = {_G = _G};-->注意,新創建一個全局表的話,原來的全局表就會被lua丟棄,為了防止原來的數據都丟失掉,因此在新的全局表a中保存原來的_G表.

setfenv(1,a);-->這樣就設置好了新的全局表.但是我們還是要注意,lua自動為_G設置了各種lua的函數,但是並不會為我們新的全局表設置這些東西.

_G.print("dde");-->因此我們要這樣調用lua的函數了.

-->print("ddef");這樣調用就會失敗,因為新的全局表中並沒有print函數.

u = 456;

_G.setfenv(1,_G);-->當然,我們可以在使用完之后,可以重新將全局表設置回去,而_G.a中則有我們的數據.

print(a.u);-->輸出456

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM