在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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,然后访问新环境中的全局变量
参考https://blog.csdn.net/jcpkwudi/article/details/87988775
|
请发表评论