從用戶的角度來看,一個模塊能夠通過 require 加載并返回一個 table,模塊導出的接口都被定義在此 table 中(此 table 被作為一個 namespace)。所有的標準庫都是模塊。標準庫被預先加載了,就像這樣:
require 函數
使用 require 函數加載模塊能夠避免多次重復加載模塊。加載一個模塊:
模塊名(modulename)不那么準確的來說就是一個文件名(Lua 文件或者是 C 庫)。一個模塊被加載后會被緩存到 pacakge.loaded[modulename] 中。看一個例子:
在 test.lua 的相同目錄下創建 main.lua 文件:
我們可以嘗試多次 require test.lua 文件,但最終只會輸出一次 Hello World。如果我們希望 require 重新加載模塊,那么可以清理 package.loaded:
范例:
編寫模塊
編寫一個模塊很簡單,我們先創建一個 table 然后把需要導出的接口放入 table 中,最后返回此 table:
模塊的返回值會被賦值給 package.loaded[modulename]:
如果模塊不返回值,那么 package.loaded[modulename] 的值將為 true:
更多的編寫模塊的方法見:http://lua-users.org/wiki/ModulesTutorial
查找模塊
如果一個模塊使用 Lua 編寫,那么將在 package.path 中查找,如果一個模塊使用 C 編寫,那么將在 package.cpath 中查找。package.path 和 package.cpath 是一個分號分隔的路徑列表,例如:
每一個路徑都有一個 ?,真正的查找路徑是將 ? 替換為模塊名之后的路徑。
實際上,我們可以自定義查找模塊的規則(通過向 package.searchers 中添加適當的 searcher 函數實現),例如我們可以把所有模塊保存在一個加密并壓縮的 zip 文件中。
一個模塊命名為 mod.sub,其是 mod 的子模塊。在查找模塊時,mod.sub 中的 . 號會被轉換為目錄分隔符。假定路徑列表如下:
那么 require ‘a.b' 將嘗試打開文件:
上一篇:Lua極簡入門指南:全局變量