lua5.1之后增加了module函数,本文通过一系列测试代码来阐述这个函数的作用

通常情况下,我们调用另一个Lua代码文件一般都会使用require函数,比如:

lua的require机制 lua module require_lua

上面的代码执行结果,输出 

Func1

100

Func2

null

我们得出以下的结论

1.Func1属于JCTest,需要显示表达出来。

2.require返回的是一个table。

3.JCTest这个table必须要return 出来

4.多次require同一个脚本返回的是同一个table。(这个原因是require会把结果存放在package.loaded这个table中,所以require执行的时候会优先判断package.loaded里是否存在,如果存在则直接返回,否则才会进行本地加载)

5.require的结果不会在_G中添加

6.Func2不属于JCTest,他是一个全局函数
 

下面我们来使用module函数看一下结果

lua的require机制 lua module require_全局函数_02

代码执行结果

true

Func1

100

null

null

我们分析得出结论

1.在使用了module函数的脚本,使用require并不能返回一个table,而是一个bool值,这个值告诉你是否加载成功

2.require一个使用了module函数的脚本,结果会被存在_G的全局表里,所以我们可以使用JCTest2:Func1()去调用函数

3.这个方式的require的结果也会在package.loaded这个table中存放,输出的100,证明了他的唯一性

4.如果在JCTest2.lua 里的函数前面加上 local,则无法访问到该函数(变量也一样,当然lua里函数也是变量)

5.虽然Func1并没有显示指明他的所属关系,但它并非是一个全局函数(重要!!!)

上面的论点5,是module函数的关键概念。

module函数的作用是创造出一个新的“环境”,在这个模块的所有全局函数都只属于这个环境,如果外部需要调用,我们只能需要使用论点2的方式。而如果,在模块中使用了local 定义变量,很抱歉,这个变量将不能被外部调用

下面我们说一下这个“环境”是什么东西

咱们把module("UI_JCTest2",package.seeall);的package.seeall去掉
 

lua的require机制 lua module require_lua_03

猜猜结果是什么?

结果报错了,编译器会告诉你print这个函数是null,它不存在

那么问题来了,print是一个全局函数(存放在_G)中,那么为什么在这里会为空呢

原因就是代码从下往下执行,当执行到module(“JCTest2”)的时候进入了一个独立的环境,注意,是独立!它不与其他环境有任何环境有任务关系,先前的环境中的全局函数和它也没有任何关系(好像一个自成的小宇宙一样)

下面我来证明我所说的话

我们把JCTest2.lua稍微改一下
 

lua的require机制 lua module require_全局函数_04

输出结果为 Func1,不报错了

这个代码主要是证明,在module函数执行前,还是可以使用上一个“环境”的内容的。

至此,module的大至功能基本已经用代码说明了

至于package.seeall的作用也可以一目了然,就是在新环境中,可以看到先前的环境。而先前的环境要看到这个新环境,必须使用require获取新环境的table,然后访问新环境中的全局变量