命名空間與模組

lua-users home
wiki

[!] VersionNotice: 下述文章屬於較早的 Lua 版本,Lua 4。Lua 5.1 具有模組系統、環境等。

Lua 沒有命名空間。有時候為了避免名稱衝突和整理程式碼,我們希望將程式碼組織成具有命名空間的套件和模組。以下是 Lua 提供支援的一些建議。

有一則 Lua 技術說明討論模組和套件 [1]

在命名空間執行 Lua 檔案

問題: dofile 指令能否擴充為 dofile(filename, table),傳入的表格用做執行檔案的全球表格?例如:
String = {}
dofile("stringlib.lua",String)
x = String.strlen("a string")
(lhf) 個人的看法是
function dofile(f,t)
  local globals=globals
  local g=globals(t)
  local rc=%dofile(f)
  globals(g)
  return rc
end

「全域」關鍵字

目前(在 Lua 4.0 及以下版本)尚未支援「全域」關鍵字。Lua 4.1 及後續版本或許會支援此功能(相關資訊於郵件清單封存區)。此功能可模擬如下

(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)


另請參閱:SampleCodeClassesAndMethods
RecentChanges · 喜好設定
編輯 · 歷史紀錄
最後編輯日期為 2007 年 1 月 5 日星期五上午 6:43 (GMT) (差異)