閱讀471 返回首頁    go 阿裏雲 go 技術社區[雲棲]


lua編程 全局變量 環境 模塊

1.全局變量與環境

lua中真正存儲全局變量的地方不是在_G裏麵,而是在setfenv(i,table)的table中,所有當前的全局變量都在這裏麵找,隻不過在程序開始時lua會默認先設置一個變量

_G=這個裏麵的table而已。所以在新設置環境後,如果還想找到之前的全局變量,通常需要附加上為新的table設置元表{_index=_G}

下麵的幾個例子:

a=1
print(a)
print(_G.a)
--正常情況,輸出1,1


a=1
setfenv(1,{})
print(a)
print(_G.a)
--這時會出錯說找不到print,因為當前的全局變量表示空的,啥也找不到的

a=1
setfenv(1,{_G=_G})
_G.print(_G.a)

print(a)

--這時_G.print(_G.a)可以正常嗎,因為可以在新的table中找到一個叫_G的表,這個_G有之前的奈爾全局變量,但是下麵的print(a)則找不到print,因為當前的table{_G=_G}沒有一個叫print的東西


local mt={__index=_G}
local t={}
setmetatable(t,mt)
setfenv(1,t)
print(a)
print(_G.a)

--這是正確輸出,因為新的全局表采用之前的表做找不到時的索引,原先的表裏麵存在print 、_G、 a這些東西


setfenv的第一個參數可以是當前的堆棧層次,如1代表當前代碼塊,2表調用當前的上一層,也可以是具體的那個函數名,表示在那個函數裏。

每個新創建的函數都將繼承創建它的那個函數的全局環境


2.require

require的意義就是導入一堆可用的名稱,這些名稱(非local的)都包含在一個table中,這個table再被包含在當前的全局表(“通常的那個_G”)中,這樣訪問一個模塊中的變量就可以使用_G.table.**了,(剛開始學習lua時還以為模塊裏的名稱在導入後直接就是在_G中的)


a=require("")的a取決於這個導入的文件的返回值,沒有返回值時true,所以在標準的情況下模塊的結尾應該return這個模塊的名字,這樣a就是這個模塊的table了(當然不這樣做也ok,隻是a就不是這個模塊名了)


最後更新:2017-04-02 16:47:59

  上一篇:go 經過修改的讀取配置文件PROPERTIES的小工具,對象盡量創建一次
  下一篇:go 安卓係統