1. require(modName)
require
会加载给定的模块,首先检查表package.loaded
来判定模块是否已经存在。若存在则加载返回package.loaded[modName]
所存储的值,否则尝试为模块找到一个加载器。
要找到一个加载器,require
首先查询package.preload[modName]
,若有值且是一个函数则断定就是一个加载。若没有值require
使用package.path
中存储的路径查找一个Lua
的加载器。若该查找也失败,则使用package.cpath
中存储的路径查找一个C
语言加载,若仍然失败则尝试使用all-in-one
加载器。
当加载一个C
语言库时,require
首先使用动态链接工具将应用程序与库连接起来,之后尝试找到该库中的C
函数,该函数要被当做加载器使用。这个C
函数的名字是字符串luaopen_
连接着复制的模块名。此外,若模块名称中函数连字符-
,则第一个连字符的前缀包括连字符都会被移除。
若require
既没有为模块查找到一个Lua
库,也没有为模块找到一个C
库,它将调用all-in-one
加载器。该加载器为给定模块的根名称,查找C
路径并找到对应的库。
一旦找到一个加载器,require
会使用单个参数modName
调用加载器。若加载器返回任何值,则require
会将其赋值给package.loaded[modName]
。若加载器无返回值且没有给package.loaded[modName]
赋与任何值,则require
为该条目赋值为true
。无论如何,require
返回package.loaded[modName]
的最终值。
若加载或运行模块有任何错误或不能为模块寻找一个加载器,则require
会发出一个错误信号。
2. LuaLoadChunksFromZIP
require
和LuaLoadChunksFromZIP
的区别:
-
require
加载包的顺序是package.loaded
、package.preload
... -
LuaLoadChunksFromZIP
会解压包并加载数据到内存中,可在package.preload
中查看使用LuaLoadChunksFromZIP
加载的包package
。
若加载到内存中的包,使用
require
就只能是完全能对应的包名,但若是文件的话可以在package.path
中查找。
网友评论