今天仔細讀了文檔,弄清楚了Lua的模塊require機制。
Lua是通過require函數來加載模塊的,只需提供模塊的名字,即可通過require(modname)來加載模塊。
Lua是如何通過modname來載入.lua或.so的呢?
默認加載過程
-
package.loaded[modname]中存了模塊的數據,有則直接返回
-
順序遍歷package.searchers,獲取loader
-
package.preload[modname]
-
Lua Loader, 通過package.searchpath搜索package.path
-
C Loader, 通過package.searchpath搜索package.cpath
-
All-In-One loader
-
-
調用loader載入模塊
-
將載入結果保存至package.loaded[modname]並返回結果
可用lua模擬載入過程:
function findloader(modname)
local loader = nil
local ext = nil
for _,s in ipairs(package.searchers) do
loader,ext = s(modname)
if type(loader)=="function" then return loader,ext end
end
error("findloader fail")
end
function myreq(modname)
local m = package.loaded[modname]
if m then return m end
local loader,ext = findloader(modname)
local ret = loader(modname, ext) or true
package.loaded[modname] = ret
return ret
end
All-In-One Loader
例如:
require("a.b.c")
-
查找a的C library(見過程2.3)
-
檢查它是否有luaopen_a_b_c函數