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]:? --]]