Lua极简入门指南(六):模块

 更新时间:2014年10月31日 09:43:28   投稿:junjie  
这篇文章主要介绍了Lua极简入门指南(六):模块,本文讲解了require函数、编写模块、查找模块等内容,需要的朋友可以参考下

从用户的角度来看,一个模块能够通过 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:\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

相关文章

  • lua闭包的理解以及表与函数的几种表达方法

    lua闭包的理解以及表与函数的几种表达方法

    本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理,以及lua中表与函数的3种表达方式的汇总
    2015-08-08
  • Lua中的元表和元方法学习笔记

    Lua中的元表和元方法学习笔记

    这篇文章主要介绍了Lua中的元表和元方法学习笔记,本文主要讲解了getmetatable获取元表、setmetatable修改元表等内容,需要的朋友可以参考下
    2014-12-12
  • Lua数据类型介绍

    Lua数据类型介绍

    这篇文章主要介绍了Lua数据类型介绍,本文讲解了Lua中的nil(空)、boolean(布尔)、number(数字)、string(字符串)、table(表)、function(函数)、thread(线程)、userdata(自定义类型)等数据类型,需要的朋友可以参考下
    2014-12-12
  • Lua模块与包学习笔记

    Lua模块与包学习笔记

    这篇文章主要介绍了Lua模块与包学习笔记,本文讲解了加载模块、加载机制等内容,需要的朋友可以参考下
    2014-12-12
  • 举例简介Lua中函数的基本用法

    举例简介Lua中函数的基本用法

    这篇文章主要介绍了举例简介Lua中函数的基本用法,--两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]],需要的朋友可以参考下
    2015-07-07
  • Lua中table库函数方法介绍

    Lua中table库函数方法介绍

    这篇文章主要介绍了Lua中table库函数方法介绍,本文讲解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以参考下
    2014-11-11
  • Lua学习笔记之数据类型

    Lua学习笔记之数据类型

    这篇文章主要介绍了Lua学习笔记之数据类型,本文同时讲解了开发环境的搭建,需要的朋友可以参考下
    2014-09-09
  • Lua中计算、执行字符串中Lua代码的方法

    Lua中计算、执行字符串中Lua代码的方法

    这篇文章主要介绍了Lua中计算、执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下
    2015-05-05
  • Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出

    Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出

    这篇文章主要介绍了Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
    2015-07-07
  • Lua编程中的一些基本语法整理

    Lua编程中的一些基本语法整理

    这篇文章主要介绍了Lua编程中的一些基本语法整理的相关资料,是Lua入门中最基础的知识,需要的朋友可以参考下
    2015-05-05

最新评论