require (modname)
!subtitle:说明
加载指定模块。
首先检查 package.loaded),判断模块是否已经被加载:
如果已经被加载,则返回 package.loaded[modname] 保存的值
否则,尝试查找该模块的 加载器
该函数根据数组 package.searchers) 里的 查找器函数 依次查找加载器:
第一个查找器尝试从 package.preload) 中查找加载器 package.preload[modname]
第二个查找器尝试从 package.path) 中查找 Lua 库形式的加载器
第三个查找器尝试从 package.cpath) 中查找 C 库形式的加载器
require("mylibs") 尝试加载 mylibs.so 中的 luaopen_mylibs 函数
第四个查找器尝试使用一体化加载器(多个子模块集成在一个 C 库中):从 package.cpath) 中查找 C 库形式的加载器
require("mylibs.xx") 尝试加载 mylibs.so 中的 luaopen_mylibs_xx 函数
require("mylibs.yy") 尝试加载 mylibs.so 中的 luaopen_mylibs_yy 函数
require("mylibs.zz") 尝试加载 mylibs.so 中的 luaopen_mylibs_zz 函数
graph TB
START([开始]) --> COND1{"package.loaded[modname] 是否存在?"} -- 是 --> R1["1.返回 package.loaded[modname]"] --> END([结束])
COND1 -- 否 --> package.searchers --> COND2{"package.preload[modname] 是否存在?"} -- 是 --> R2["2.尝试调用 package.preload[modname]"] --> END
COND2 -- 否 --> COND3{"package.path 中是否包含 Lua 库形式的加载器?"} -- 是 --> R3["3.尝试调用 modname.lua"] --> END
COND3 -- 否 --> COND4{"package.cpath 中是否包含 C 库形式的加载器?"} -- 是 --> R4["4.尝试调用 modname.so 中的 luaopen_modname"] --> END
!subtitle:参数
modname - 要加载的模块名
!subtitle:返回值
返回模块的返回值
print("预加载:")
for k, v in pairs(package.preload) do
print(k, v)
end
print("\nLua 库:", package.path)
print("\nC 库:", package.cpath)