Lua教程(十): 全局变量和非全局的环境
Lua将其所有的全局变量保存在一个常规的table中,这个table被称为“环境”。它被保存在全局变量_G中。
1.全局变量声明:
Lua中的全局变量不需要声明就可以使用。尽管很方便,但是一旦出现笔误就会造成难以发现的错误。我们可以通过给_G表加元表的方式来保护全局变量的读取和设置,这样就能降低这种笔误问题的发生几率了。见如下示例代码:
--该table用于存储所有已经声明过的全局变量名
localdeclaredNames={}
localmt={
__newindex=function(table,name,value)
--先检查新的名字是否已经声明过,如果存在,这直接通过rawset函数设置即可。
ifnotdeclaredNames[name]then
--再检查本次操作是否是在主程序或者C代码中完成的,如果是,就继续设置,否则报错。
localw=debug.getinfo(2,"S").what
ifw~="main"andw~="C"then
error("attempttowritetoundeclaredvariable"..name)
end
--在实际设置之前,更新一下declaredNames表,下次再设置时就无需检查了。
declaredNames[name]=true
end
print("Setting"..name.."to"..value)
rawset(table,name,value)
end,
__index=function(_,name)
ifnotdeclaredNames[name]then
error("attempttoreadundeclaredvariable"..name)
else
returnrawget(_,name)
end
end
}
setmetatable(_G,mt)
a=11 localkk=aa
--输出结果为: --[[ Settingato11 lua:d:/test.lua:21:attempttoreadundeclaredvariableaa stacktraceback: [C]:infunction'error' d:/test.lua:21:infunction<d:/test.lua:19> d:/test.lua:30:inmainchunk [C]:? --]]
热门推荐
1 训练狗狗憋尿
2 狗狗追踪训练
3 狗狗训练要多少钱
5 深圳狗狗训练
6 训练狗狗唤回
7 狗狗叫怎么训练
8 狗狗训练班
10 狗狗社会化训练
11 狗狗叫回训练
12 广州狗狗训练学校
13 狗狗训练躺下
14 狗狗随行训练
15 训练狗狗巡回
16 狗狗要怎么训练
17 狗狗喂食训练
18 训练狗狗躺下