lua5.1之后增加了module函数,本文通过一系列测试代码来阐述这个函数的作用
通常情况下,我们调用另一个Lua代码文件一般都会使用require函数,比如:
上面的代码执行结果,输出
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函数看一下结果
代码执行结果
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去掉
猜猜结果是什么?
结果报错了,编译器会告诉你print这个函数是null,它不存在
那么问题来了,print是一个全局函数(存放在_G)中,那么为什么在这里会为空呢
原因就是代码从下往下执行,当执行到module(“JCTest2”)的时候进入了一个独立的环境,注意,是独立!它不与其他环境有任何环境有任务关系,先前的环境中的全局函数和它也没有任何关系(好像一个自成的小宇宙一样)
下面我来证明我所说的话
我们把JCTest2.lua稍微改一下
输出结果为 Func1,不报错了
这个代码主要是证明,在module函数执行前,还是可以使用上一个“环境”的内容的。
至此,module的大至功能基本已经用代码说明了
至于package.seeall的作用也可以一目了然,就是在新环境中,可以看到先前的环境。而先前的环境要看到这个新环境,必须使用require获取新环境的table,然后访问新环境中的全局变量