LUA中关于全局变量环境是本文要介绍的内容,主要输来了解并学习全局变量的环境,具体内容先来看本文详解。
一、全局变量的环境
LUA在全局变量的实现方式上用了一个绝对让我们喜闻乐见的做法,复用已有的table机制,将全局变量都保存在_G表中。这样做好处很多。
从语言实现角度来说,不需要为了全局变量单独去做一份实现,只要复用下table机制即可。
从使用角度来说,虽然你是全局变量看起来较为牛逼(local变量内牛满面的蹲在一边哭)一点,但是你也不幸的被放在了table中。于是所有针对一个table可以做的事情针对全局量一样可以做:
1、变量动态名称访问: 运行期才知道那全局量叫啥,访问起来吃力。现在好了,因为放在了table中,所以只要写上 _G[varname] 就可以访问了,写上 _G[varname]=ABC就可以赋值了。不用再去靠拼接字符串来chunk代码了。
2、metatable可以使用。虽然又提到了metatable,不用说这里指代的是table御用__index和__newindex运算符。通过实现这两个运算符,我们可以对全局变量_G表做许多的事情,其中最常见的就是,通过重新实现__index和__newindex来为LUA中的全局变量使用规则进行修改,加上强类型语言中的“先声明后使用,不声明不能用”的规则。这点在手册上有详细的描述不再COPY。
二、全局变量的局部环境
在C++中变量的作用域是从内向外查找,并且具备遮蔽效果。在lua中全局变量方面,有一个特点很有意思,就是允许每一个函数具有自己的局部“全局环境”,听着冲突其实不然。“局部”意指函数的内部,“全局环境”就是指全局变量保存的_G表。也就是说LUA允许每一个函数内部使用一个私有的_G表,在文章中,这被称作是函数的环境。setfenv()可以更改一个指定函数的环境,***个参数为函数名,第二个参数为这个函数的私有_G名,可以先初始化好再传递过去。***个参数也可以是一个数字,1表示当前正在执行的这个函数,2表示当前函数的调用者,3表示调用者的调用者(其实这个数字是栈顶的活动函数调用层次)。
不过要注意一点,调用setfenv()设置了私有_G表后,原来的_G表默认就不可访问了,这个时候很多原来_G中的函数你都无法使用,比如print。因此你可以或者在私有_G表中保存原始_G表,或者为私有_G表设置__index操作符指向原始_G表,相比来说我更喜欢后者,优雅且省事(懒%……)。
ps, 感慨下,table是LUA中的***复杂结构,所有复杂的数据结构和描述都要基于此。__index和__newindex是table非常重要的两个metatable运算符没有之一。
小结:LUA中关于全局变量环境学习教程的内容介绍完了,希望通过本文的学习能对你有所帮助!