Lua极简入门指南(六):模块_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:\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

时间: 2024-11-05 17:19:11

Lua极简入门指南(六):模块_Lua的相关文章

Lua极简入门指南:全局变量_Lua

全局环境 Lua 把全局变量放在一个 table _G 中,这个 table 被叫做全局环境(global environment).打印所有的全局变量名: 复制代码 代码如下: for n in pairs(_G) do print(n) end _ENV(Lua 5.2 开始支持) 对于一个 free name(名字没有绑定任何声明)var 实际上会被转换为 _ENV.var(每个 chunk 中都会存在一个名为 _ENV 的变量): 复制代码 代码如下: v1 = 1 local v2 =

Lua极简入门指南(一):函数篇_Lua

Lua 和其他很多语言一样,函数调用时参数列表被包裹在括号中: 复制代码 代码如下: print('Hello World') 特别的情况是,如果函数调用时只有一个参数,并且此参数为字符串 literal(字面量)或者 table 构造器(constructor)时,包裹参数的括号可以省略: 复制代码 代码如下: print 'Hello World' <--> print('Hello World') type{}              <--> type({}) Lua 为

Lua 极简入门指南(七):面向对象编程_Lua

类 在很多面向对象的语言中有类(class)的概念,对象是类的实例.Lua 中不存在类的概念.Lua 就像 JavaScript 一样是面向原型的语言(http://en.wikipedia.org/wiki/Prototype-based_programming),这类语言使用一个对象表示一个"类",其他对象(此类的实例)使用此对象作为原型.我们有两个 table p 和 obj,将 p 设置为 obj 的原型(回顾:http://www.jb51.net/article/56690

Lua极简入门指南(三): loadfile和错误处理_Lua

编译 Lua 虽然是解释性语言,但 Lua 源码总是被编译为中间形式后再执行. dofile 用于载入并执行一个 Lua 文件,相比之下,loadfile 用于载入一个 Lua 文件,但并不执行,确切的说 loadfile 编译了一个 chunk,并返回此被编译的 chunk(被作为一个函数): 复制代码 代码如下: c = loadfile('./test.lua') c() dofile 可以被实现为: 复制代码 代码如下: function dofile(filename)     loc

Lua极简入门指南(一):基础知识篇_Lua

本文是<Programming in Lua 3rd>读书笔记. Chunks 一个 Chunk 就是一组被执行的语句,例如一个文件或者交互模式下的一行. 标识符(identifiers) 我们应该避免使用以 _ 开头并跟上一个或者多个大写字母的字符串来作标识符,它们被保留作特殊的用途(例如:_VERSION). 注释 单行注释使用 复制代码 代码如下: -- 多行注释使用 复制代码 代码如下: --[[ 和 --]] 类型简介 Lua 存在的数据类型包括: 1.nil.此类型只有一个值 ni

Nodejs极简入门教程(一):模块机制_node.js

JavaScript 规范(ECMAScript)没有定义一套完善的能适用于大多数程序的标准库.CommonJS 提供了一套 JavaScript 标准库规范.Node 实现了 CommonJS 规范. 模块基础 在 Node 中,模块和文件是一一对应的.我们定义一个模块: 复制代码 代码如下: // circle.js var PI = Math.PI;   // 导出函数 area exports.area = function(r) {     return PI * r * r; }  

Nodejs极简入门教程(三):进程_node.js

Node 虽然自身存在多个线程,但是运行在 v8 上的 JavaScript 是单线程的.Node 的 child_process 模块用于创建子进程,我们可以通过子进程充分利用 CPU.范例: 复制代码 代码如下: var fork = require('child_process').fork; // 获取当前机器的 CPU 数量 var cpus = require('os').cpus(); for (var i = 0; i < cpus.length; i++) {     // 生

JavaScript极简入门教程(一):基础篇_javascript技巧

阅读本文需要有其他语言的编程经验. 开始学习之前 大多数的编程语言都存在好的部分和差的部分.本文只讲述 JavaScript 中好的部分,这是因为: 1.仅仅学习好的部分能够缩短学习时间 2.编写的代码更加健壮 3.编写的代码更加易读 4.编写的代码更加易于维护 弱类型和强类型 通常来说,越早的修复错误,为之付出的代价就越小.强类型语言的编译器可以在编译时检查某些错误.而 JavaScript 是一门弱类型语言,其解释器无法检查类型错误,但实践表明: 1.强类型能够避免的错误并不是那些关键性错误

JavaScript极简入门教程(二):对象和函数_javascript技巧

阅读本文需要有其他语言的编程经验. JavaScript 中的简单类型包括: 1.数字 2.字符串 3.布尔(true 和 false) 4.null 5.undefined 此外的其他类型均是对象(我们不要被 typeof 操作符的返回值所迷惑),例如: 1.函数 2.数组 3.正则表达式 4.对象(对象自然也是对象) 对象基础 在 JavaScript 中,对象是属性的集合(对象为关联数组),每个属性包括: 1.属性名,必须为字符串 2.属性值,可以为除了 undefined 之外的任何值