从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标准库被预先加载了,就像这样:
[url=http://lua-users.org/wiki/ModulesTutorial]http://lua-users.org/wiki/ModulesTutorial[/url]
[b]查找模块[/b]
如果一个模块使用 Lua 编写,那么将在 package.path 中查找,如果一个模块使用 C 编写,那么将在 package.cpath 中查找。package.path 和 package.cpath 是一个分号分隔的路径列表,例如:
C:\bin\lua\lua\?.lua;C:\bin\lua\lua\?\init.lua;C:\bin\lua\?.lua;C:\bin\lua\?\init.lua;.\?.lua
每一个路径都有一个 ?,真正的查找路径是将 ? 替换为模块名之后的路径。
实际上,我们可以自定义查找模块的规则(通过向 package.searchers 中添加适当的 searcher 函数实现),例如我们可以把所有模块保存在一个加密并压缩的 zip 文件中。
一个模块命名为 mod.sub,其是 mod 的子模块。在查找模块时,mod.sub 中的 . 号会被转换为目录分隔符。假定路径列表如下:
C:\bin\lua\lua\?.lua;.\?.lua
那么 require ‘a.b' 将尝试打开文件:
C:\bin\lua\lua\a\b.lua
.\a\b.lua