Lua语法小贴士(十)全局变量
2016-11-04 22:44
393 查看
Lua里我们可以随时声明或调用全局变量。
例如:test = 1 print(test)
当我们访问一个不存在的全局变量的时候,会返回nil,例如:
print(tst)
虽然很方便,但是往往会因为拼写错误而导致一些不容易发现的BUG。
Lua可以使用_G来表示全局变量所在的表,这样我们就可以修改_G表的__index和__newindex两个元方法(参考Lua语法小贴士(五)元表与元方法)来限制全局变量的访问。
local declaredNames = {} setmetatable(_G,{ __newindex = function(t,n,v) if not declaredNames then local w = debug.getinfo(2,"S").what if w ~= "main" and w ~= "C" then error("attempt to write to undeclared variable "..n, 2) end declaredNames = true end rawset(t,n,v) end, __index = function(_, n) if not declaredNames then error("attempt to read undeclared variable"..n, 2) else return nil end end,})
我们通过debug.getinfo(参考Lua语法小贴士(十一)debug库)获取了函数的类型,Lua表示是普通的lua函数,C表示是C函数,main是在主chunk里,也就是没有被function
end包围的区域。
这样我们在主chunk里面声明全局变量就没有问题,例如:
testChunk = 23 print(testChunk)
但是下面这段在函数里面访问未声明的全局变量时,就会报错:
local function a() funcTest = 1 end a()
相关文章推荐
- Lua编程笔录--Lua初识及语法一(注释,变量命名,全局/局部变量,数据类型)
- 5.1之前, 全局变量存储在_G这个table中, 这样的操作:5.3 lua_setupvalue
- Python语法基础22.局部变量和全局变量
- Lua 全局变量
- 打印lua中的全局变量表_G
- Lua Module对全局变量访问
- PHP 学习笔记(一):基础教程:语法,变量,函数,数组,超全局
- Lua中创建全局变量的小技巧(禁止未预期的全局变量)
- Lua学习之【2】:全局变量、关键字、类型
- 【lua】第一章-lua基础(搭建环境,变量语法基础)
- Lua语法小贴士(十二)loadstring和loadfile
- php部分(查看文件、建立站点、语法变量、变量的几个方法、“全局局部变量的调用”、static、函数参数的作用域);
- JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用
- 04,Lua 全局变量
- lua中的全局变量与局部变量
- 深入理解Lua的全局变量_G以及源码实现
- c++导出全局变量给lua使用
- LUA中的全局变量环境
- Lua语法小贴士(四)字符串缓冲
- C/C++语法知识精华整理(2)-栈与堆、内存四大区域、 全局变量、线程技术、位字段、函数返回值副本机制等