lua的模組載入require

2022-09-05 16:06:17 字數 1452 閱讀 4921

載入指定的模組。首先函式會在 package.loaded 這個表中檢視是否已經載入 了 modname 這個模組。如果是,那麼 require 會返回儲存在 package.loaded[modname]的值。否則它將嘗 試去查詢乙個載入該模組的載入器。

require 是由 package.searchers 引導來查詢載入器的 。修改 package.searchers 可以修改 require 查詢模組的方式。下面的解釋是基於預設配置的 package.searchers。

require 首先查詢 package.preload[modname]是否有值,是則該值(應該是個函式)為加 載器,否則 require 根據儲存在 package.path 的路徑去查詢 lua 載入器。如果找不到,那就 根據儲存在 package.cpath 的路徑去查詢,如果還是找不到,那麼會嘗試使用乙個 「整合」 (all-in-one)的載入器(參考 package.searchers)。

一旦找到了載入器, require 會以兩個引數去呼叫它,這兩個引數為模組名及乙個用來 表示如何找到載入器的額外引數 。(如果載入器來自某個檔案,那額外引數就是該檔名) 如果載入器返回乙個非空的值, require將該返回值賦值給 package.loaded[modname],否則 將 true 賦值給 package.loaded[modname] 。不管哪種情況, require 都會返 回 package.loaded[modname] 的值。

如果在載入或執行模組時發生了錯誤,或者無法找到任何該模組的載入器, require 會 喚起乙個錯誤。 

總結:1.pageage.preload 乙個儲存指定模組載入器的 table 要找到乙個載入器,require首先查詢package.preloaded[modname].如果它有值,該值(應該是乙個函式)就是載入器.如果沒值require使用package.path中儲存的路徑查詢乙個lua的載入器.如果該查詢也失敗,它使用package.cpath中儲存的路徑查詢乙個c語言載入器(c loader).如果還是失敗,它嘗試使用all-in-one載入器

package.preload['pl'] = function()

local str = load_pl_from_c()

local fn = loadstring(str)

return fn()

endpackage.preload ["foo"] = function () print "loading foo" end require "foo" --> loading foo

2.一旦找到乙個載入器,require使用單個的引數modname呼叫載入器.如果載入器返回任何值,require將其賦值給package.loaded[modname].如果載入器沒有返回值且沒有給package.loaded[modname]賦與任何值,則require為該條目賦值為true.

3.package.path = package.path .. ";src/"  新增搜尋路徑

lua模組載入

module mod name,package.seeall 函式 通過package.seeall選項可令舊全域性環境可見。require mod name 載入指定的模組。先檢測package.loaded表中是否存在modname,存在則直接返回當中的值,沒有則通重載入器載入modname。p...

Lua動態載入模組

function reload modulename package.loaded modulename nil require modulename end 使用以上 即可重新載入乙個檔案。這樣修改完lua 後,可以不用重啟程式立刻生效。模組a a function a.test1 print 1...

lua中的require機制

lua中的require機制 2008 06 05 09 13 27 分類 python ruby lua中的require機制 為了方便 管理,通常會把lua 分成不同的模組,然後在通過require函式把它們載入進來。現在看看lua的require的處理流程。1 require機制相關的資料和函...