第一版是針對 Lua 5.0 所寫的。雖然對後來的版本來說仍然有很大的相關性,但還是有一些差異。
第四版針對 Lua 5.3,可以在 Amazon 和其他書店買到。
購買這本書,您也可以協助 支援 Lua 專案。
![]() |
程式設計於 Lua | ![]() |
第二部分。表格和物件 第 15 章。套件 |
定義套件的一個簡單方法是將套件名稱寫成套件中每個物件的前綴。例如,假設我們正在撰寫一個用來處理複數的函式庫。我們將每個複數表示成一個表格,其中有欄位 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
)。不過,我們認為套件在開啟時回傳自己是個好習慣。額外的回傳不花任何成本,而且允許以其他方式處理套件。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |