记录对lua require时内部的执行流程和自定义加载器方法
更详细的说明参考手册:http://cloudwu.github.io/lua53doc/manual.html#pdf-require
当调用require(modname)时,lua执行相当于如下流程
local function myrequire(modname)
local val = package.loaded[modname] -- loaded里已有,直接返回
if package.loaded[modname] then
return val
end
for _,loader in ipairs(package.searchers) do -- 遍历searchers查找加载器
local func,msg = loader(modname) -- 传入modname调用加载器
local t = type(func)
if t == "function" then -- 加载器返回的是函数,表示找到
local ret = func(modname,msg) -- 用modname和加载器返回的另一个参数调用func
if ret == nil then
ret = true
end
package.loaded[modname] = ret
break
elseif t == "string" then -- 返回的是字符串,表示找不到的提示信息,输出
print(func)
else -- 返回的其它值都表示找不到,不提示
end
end
end
package.searchers里存的是加载器,加载器以modname传入调用,其返回值有
1.函数(