package.cpath()
require 用于搜索 C 加载程序的路径。 Lua 使用环境变量 LUA_CPATH 或 luaconf.h 中定义的默认路径,以与初始化 Lua 路径 package.path 相同的方式初始化 C 路径 package.cpath。
package.loaded()
require 用来控制哪些模块已经加载的表。 当你需要一个模块 modname 并且 package.loaded[modname] 不是 false 时,require 简单地返回存储在那里的值。
package.loaders()
require 用来控制如何加载模块的表。 此表中的每个条目都是一个搜索器函数。 当寻找一个模块时,require 以升序调用这些搜索器中的每一个,并将模块名称(给 require 的参数)作为其唯一参数。 该函数可以返回另一个函数(模块加载器)或一个字符串来解释为什么它没有找到该模块(如果没有什么可说的则返回 nil)。 Lua 用四个函数初始化这个表。 第一个搜索器只是在 package.preload 表中查找加载器。 第二个搜索器使用存储在 package.path 中的路径查找作为 Lua 库的加载器。 路径是由分号分隔的一系列模板。 对于每个模板,搜索者将模板中的每个问号更改为文件名,文件名是模块名,每个点被“目录分隔符”(如Unix中的“/”)代替; 然后它将尝试打开生成的文件名。 因此,例如,如果 Lua 路径是字符串
“./?.lua;./?.lc;/usr/local/?/init.lua”
搜索模块 foo 的 Lua 文件将尝试按顺序打开文件 ./foo.lua、./foo.lc 和 /usr/local/foo/init.lua。 第三个搜索器使用变量 package.cpath 给出的路径查找作为 C 库的加载器。 例如,如果 C 路径是字符串
“./?.so;./?.dll;/usr/local/?/init.so”
模块 foo 的搜索器将尝试按顺序打开文件 ./foo.so、./foo.dll 和 /usr/local/foo/init.so。一旦找到 C 库,该搜索器首先使用动态链接工具将应用程序与库链接起来。然后它会尝试在库中找到一个 C 函数用作加载程序。这个 C 函数的名称是字符串“luaopen_”与模块名称的副本连接在一起,其中每个点都由下划线代替。此外,如果模块名称有一个连字符,它的前缀直到(包括)第一个连字符被删除。例如,如果模块名称是 a.v1-b.c,函数名称将是 luaopen_b_c。第四个搜索者尝试使用一体式装载机。它在 C 路径中搜索给定模块的根名称的库。例如,当需要 a.b.c 时,它将为 a 搜索 C 库。如果找到,它会在其中查找子模块的开放功能;在我们的示例中,这将是 luaopen_a_b_c。有了这个工具,一个包可以将几个 C 子模块打包到一个库中,每个子模块都保持其原来的开放功能。
package.loadlib(libname,funcname)
将主机程序与 C 库 libname 动态链接。 在该库中,查找函数 funcname 并将该函数作为 C 函数返回。 (因此,funcname 必须遵循协议)。 这是一个低级功能。 它完全绕过了包和模块系统。 与 require 不同,它不执行任何路径搜索,也不会自动添加扩展。 libname 必须是 C 库的完整文件名,必要时包括路径和扩展名。 funcname 必须是 C 库导出的确切名称(这可能取决于所使用的 C 编译器和链接器)。 ANSI C 不支持此函数。因此,它仅在某些平台(Windows、Linux、Mac OS X、Solaris、BSD 以及其他支持 dlfcn 标准的 Unix 系统)上可用。
package.path()
require 用于搜索 Lua 加载程序的路径。 在启动时,Lua 使用环境变量 LUA_PATH 的值或 luaconf.h 中定义的默认路径(如果未定义环境变量)初始化此变量。 任何 ”;;” 环境变量中的值替换为默认路径。
package.preload()
存储特定模块加载程序的表。
package.seeall(module)
为模块设置一个元表,其 __index 字段引用全局环境,以便该模块从全局环境继承值。 用作功能模块的选项。