命名空間與模組 |
|
Lua 沒有命名空間。有時候為了避免名稱衝突和整理程式碼,我們希望將程式碼組織成具有命名空間的套件和模組。以下是 Lua 提供支援的一些建議。
有一則 Lua 技術說明討論模組和套件 [1]。
dofile
指令能否擴充為 dofile(filename, table)
,傳入的表格用做執行檔案的全球表格?例如:String = {} dofile("stringlib.lua",String) x = String.strlen("a string")
function dofile(f,t) local globals=globals local g=globals(t) local rc=%dofile(f) globals(g) return rc end
(lhf) 如果你願意使用「全域」宣告,那麼你可以立即進行很類似的操作:不要使用「全域」關鍵字,請改用具有語法的「全域」函式
全域「myvar」-- 只能是一個名稱
全域{"a","b"} -- 多個名稱
do local G={} function global(x) if type(x)=="string" then %G[x]=1 else for i,v in x do %G[v]=1 end end end end
現在,你可以透過設定「setglobal」及/或「getglobal」的標籤方法來實作你想要的語意,方法是檢查名稱是否符合 G。
因此,若要實作需要宣告才能寫入全域變數的語意,請設定「setglobal」標籤方法,如果指定的變數不在 G 中,請擲回錯誤。錯誤一發生就會顯示;換句話說,沒有延遲!
有關詳細資料,請參閱未初始化和唯讀變數的常見問答集。
這種做法的問題是宣告會永久存在,而不僅僅是相對於當前區塊。
(ET) 或採用簡單方法
global = globals()
...
global.x = 1
print(global.y)