Lua 模組與包

2022-07-06 20:12:12 字數 1877 閱讀 1686

從使用者觀點來看,乙個模組就是乙個程式庫,可以通過require來載入(require用於使用模組,module用於建立模組),然後便得到了乙個全域性變數,表示乙個table,這個table就像乙個名字空間,其內容就是模組中匯出的所有東西,例如函式和變數。乙個規範的模組還應使require返回這個table

require實現如下:

說明:

table  package.loaded檢查模組是否已經載入,如果載入require返回相應的值,只要乙個模組已載入,後續的require呼叫都會返回同乙個值,不會再次載入。

如果模組未載入,require會嘗試為該模組找到乙個載入器(loader,**中一抽象函式findloader表示),會現在table package.preload 中查詢傳入的模組名,如果在其中找到了乙個函式,就以該函式作為模組的載入器。

如果require為指定的模組找到了乙個lua檔案,它就通過loadfile載入檔案,如果找到的是乙個c程式庫,就通過loadlib載入,loadfile和loadlib都只是載入**,並沒有執行他們,require將返回值儲存到table package.loaded中,以此作為將來對同一模組呼叫的返回值,如果載入器沒有返回值,require就會返回table  package.loaded 中的值。

注意,上述**中在呼叫載入器前,require將true賦給package.loaded相應字段,以此將模組標記為已載入。這是因為如果乙個模組要求載入另乙個模組,而後者有遞迴的載入前者,那麼後者的require呼叫會馬上返回,從而避免無限迴圈。

若要強制使require對同乙個庫載入兩次,可以刪除package.loaded中的模組,再次載入該模組:

require採用的路徑是一連串的模式,其中每項都是一種將模組名轉換為檔名的方式,路徑中每項都是乙個檔名,每項中還包含乙個可選的問號。require會以模組名來代替每個「?」然後根據替換結果檢查是否存在這樣乙個檔案,如果不存在,就會嘗試下一項,路徑中每項以分號隔開,require用於搜尋lua檔案的路徑存放在變數package.path中,如果require無法找到模組名相符的lua檔案,它就會找c程式庫,輸出package.path 和package.cpath分別如下:

呼叫 require("sql")時,將分別嘗試開啟如下檔案:

.\sql.lua

d:\lua\5.1\lua\sql.lua

預設情況下module不提供外部訪問。 module函式,其對應的功能實現如下:

module不提供外部訪問,必須在呼叫它前,為需要訪問的外部函式或者模組宣告適當的區域性變數,也可以通過繼承實現外部訪問,只需在呼叫module時加上乙個選項,package.seeall,這個選項等價於以下**:

因此,只需要如下使用:

lua支援具有層級性的模組名,可以用乙個點來分隔名稱中的層級。假如,乙個模組名為mod.sub,那麼它就是mod的乙個子模組,在搜尋乙個定義子模組的檔案時,require會將點轉換為另乙個字元,通常就是系統的目錄分隔符(unix上為"/",windows上為"\")

Lua 模組與包

模組類似於乙個封裝庫,從 lua 5.1 開始,lua 加入了標準的模組管理機制,可以把一些公用的 放在乙個檔案裡,以 api 介面的形式在其他地方呼叫,有利於 的重用和降低 耦合度。lua 的模組是由變數 函式等已知元素組成的 table,因此建立乙個模組很簡單,就是建立乙個 table,然後把需...

Lua 模組與包

模組類似於乙個封裝庫,從lua 5.1開始,lua加入了標準的模組管理機制,可以把一些公用的 放在乙個檔案裡,以api介面的形式在其他地方呼叫,有利於 的重用和降低 耦合度。lua的模組是由變數 函式等已知元素組成的table,因此建立乙個模組很簡單,就是建立乙個table,然後把需要匯出的常量 函...

lua 模組與包 五

模組類似於1個封裝庫,從lua 5.1 開始,lua加入了標準的模組管理機制,可以把一些公用的 放在乙個檔案裡,以api介面的形式在其他地方呼叫,用利於 的重用和降低 的耦合度。lua的模組是由變數 函式等已知元素組成的table,因此建立1個模組就是建立1個table,把 需要匯出的常量 函式放入...