第一版是針對 Lua 5.0 所寫的。雖然對後來的版本來說仍然有很大的相關性,但還是有一些差異。
第四版針對 Lua 5.3,可以在 Amazon 和其他書店買到。
購買這本書,您也可以協助 支援 Lua 專案


15.1 – 基本方法

定義套件的一個簡單方法是將套件名稱寫成套件中每個物件的前綴。例如,假設我們正在撰寫一個用來處理複數的函式庫。我們將每個複數表示成一個表格,其中有欄位 r(實部)和 i(虛部)。我們在另一個表格中宣告所有新的運算,它作為一個新的套件

    complex = {}
    
    function complex.new (r, i) return {r=r, i=i} end
    
    -- defines a constant `i'
    complex.i = complex.new(0, 1)
    
    function complex.add (c1, c2)
      return complex.new(c1.r + c2.r, c1.i + c2.i)
    end
    
    function complex.sub (c1, c2)
      return complex.new(c1.r - c2.r, c1.i - c2.i)
    end
    
    function complex.mul (c1, c2)
      return complex.new(c1.r*c2.r - c1.i*c2.i,
                         c1.r*c2.i + c1.i*c2.r)
    end
    
    function complex.inv (c)
      local n = c.r^2 + c.i^2
      return complex.new(c.r/n, -c.i/n)
    end
    
    return complex
這個函式庫定義了一個單一的全域名稱,complex。所有其他定義都放在這個表格中。

有了這個定義,我們可以使用任何複數運算來限定運算名稱,如下所示

    c = complex.add(complex.i, complex.new(10, 20))

使用表格來處理套件並未提供與實際套件相同的功能。首先,我們必須在每個函式定義中明確放入套件名稱。其次,在同一個套件中呼叫另一個函式的函式必須限定所呼叫函式的名稱。我們可以使用套件的固定區域名稱(例如 P)來改善這些問題,然後將此區域名稱指定給套件的最終名稱。遵循這個準則,我們會像這樣撰寫前一個定義

    local P = {}
    complex = P           -- package name
    
    P.i = {r=0, i=1}
    function P.new (r, i) return {r=r, i=i} end
    
    function P.add (c1, c2)
      return P.new(c1.r + c2.r, c1.i + c2.i)
    end
    
       ...
每當一個函式呼叫同一個套件中的另一個函式(或每當它遞迴呼叫自己時),它仍然需要在名稱前加上前綴。至少,這兩個函式之間的連結不再依賴於套件名稱。此外,在整個套件中只有一個地方會寫到套件名稱。

您可能注意到套件中的最後一個陳述是

    return complex
此回傳並非必要,因為套件已指派給全域變數 (complex)。不過,我們認為套件在開啟時回傳自己是個好習慣。額外的回傳不花任何成本,而且允許以其他方式處理套件。