LUA中关于全局变量环境学习教程

移动开发 iOS
LUA在全局变量的实现方式上用了一个绝对让我们喜闻乐见的做法,复用已有的table机制,将全局变量都保存在_G表中。这样做好处很多。

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中关于全局变量环境学习教程的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-08-24 15:22:09

2011-08-24 14:14:13

LUA环境 配置

2011-08-25 13:44:11

LUA下载SciTE

2011-08-24 15:34:44

MinGWLua环境配置

2013-07-17 16:16:06

Android全局变量定义全局变量Application

2011-08-23 16:37:05

Lua数学库

2011-08-24 17:09:35

LUA闭包函数

2010-02-01 14:28:37

Python全局变量

2009-11-06 13:28:19

Javascript框

2011-08-23 15:34:56

Lua模式 匹配

2011-08-23 17:06:03

2011-08-24 13:27:07

Lua 游戏C接口脚本

2011-08-23 16:59:16

C++LUA脚本LUA API

2011-08-24 11:03:33

LUA环境 安装

2015-01-07 14:41:32

Android全局变量局部变量

2013-07-25 15:15:26

iOS开发学习iOS全局变量

2010-11-12 10:08:55

SQL Server全

2011-08-23 16:48:41

Lua 5.1API 函数

2017-02-08 12:28:37

Android变量总结

2011-08-24 15:42:38

LUA源代码
点赞
收藏

51CTO技术栈公众号