Lua的require機制


今天仔細讀了文檔,弄清楚了Lua的模塊require機制。
Lua
是通過require函數來加載模塊的,只需提供模塊的名字,即可通過require(modname)來加載模塊。
Lua
是如何通過modname來載入.lua.so的呢?

默認加載過程

  1. package.loaded[modname]中存了模塊的數據,有則直接返回
  2. 順序遍歷package.searchers,獲取loader
    1. package.preload[modname]
    2. Lua Loader, 通過package.searchpath搜索package.path
    3. C Loader, 通過package.searchpath搜索package.cpath
    4. All-In-One loader
  3. 調用loader載入模塊
  4. 將載入結果保存至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")

  1. 查找aC library(見過程2.3)
  2. 檢查它是否有luaopen_a_b_c函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM