Lua极简入门指南(六):模块
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标准库被预先加载了,就像这样: 复制代码 代码如下: math = require 'math' string = require 'string' require 函数 使用 require 函数加载模块能够避免多次重复加载模块。加载一个模块: 复制代码 代码如下: require 'modulename' 模块名(modulename)不那么准确的来说就是一个文件名(Lua 文件或者是 C 库)。一个模块被加载后会被缓存到 pacakge.loaded[modulename] 中。看一个例子: 复制代码 代码如下: -- test.lua print 'Hello World' 在 test.lua 的相同目录下创建 main.lua 文件: 复制代码 代码如下: -- main.lua require 'test' 我们可以尝试多次 require test.lua 文件,但最终只会输出一次 Hello World。如果我们希望 require 重新加载模块,那么可以清理 package.loaded: 复制代码 代码如下: package.loaded[modulename] = nil 范例: 复制代码 代码如下: require 'test' --> Hello World package.loaded.test = nil require 'test' --> Hello World 编写模块 编写一个模块很简单,我们先创建一个 table 然后把需要导出的接口放入 table 中,最后返回此 table: 复制代码 代码如下: -- test.lua local exports = {} function exports.foo() print 'Hello World' end return exports 模块的返回值会被赋值给 package.loaded[modulename]: 复制代码 代码如下: assert(require 'test' == package.loaded.test) 如果模块不返回值,那么 package.loaded[modulename] 的值将为 true: 复制代码 代码如下: -- 假定 test.lua 是一个空文件 local t = require 'test' print(t) --> true print(package.loaded.test) --> true 更多的编写模块的方法见:http://lua-users.org/wiki/ModulesTutorial 查找模块 如果一个模块使用 Lua 编写,那么将在 package.path 中查找,如果一个模块使用 C 编写,那么将在 package.cpath 中查找。package.path 和 package.cpath 是一个分号分隔的路径列表,例如: 复制代码 代码如下: C:binlualua&;.lua;C:binlualua&;init.lua;C:binlua&;.lua;C:binlua&;init.lua;.&;.lua 每一个路径都有一个 ?,真正的查找路径是将 ? 替换为模块名之后的路径。 实际上,我们可以自定义查找模块的规则(通过向 package.searchers 中添加适当的 searcher 函数实现),例如我们可以把所有模块保存在一个加密并压缩的 zip 文件中。 一个模块命名为 mod.sub,其是 mod 的子模块。在查找模块时,mod.sub 中的 . 号会被转换为目录分隔符。假定路径列表如下: 复制代码 代码如下: C:binlualua&;.lua;.&;.lua 那么 require ‘a.b' 将尝试打开文件: 复制代码 代码如下: C:binlualuaab.lua .ab.lua 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |