相信用lua的人都遇到过由于拼写错误把局部变量变成全局变量的情况,如何避免这个问题呢?
直接上代码!
local mt = {
__index = function(_, key)
local info = debug.getinfo(2, "S")
if info and info.what ~= "main" and info.what ~= "C" then
print("访问不存在的全局变量:" .. key)
end
return rawget(_G, key)
end,
__newindex = function(_, key, value)
local info = debug.getinfo(2, "S")
if info and info.what ~= "main" and info.what ~= "C" then
print("赋值不存在的全局变量:" .. key)
end
return rawset(_G, key, value)
end
}
setmetatable(_G, mt)
先给全局表_G设置metatable,当访问到不存在的全局变量,或者对不存在的全局变量进行赋值时,调用debug.getinfo(2, “S”)获取调用的堆栈,如果不在主函数访问或者赋值新的全局变量,则抛出日志,提示开发者修改。
这就保证了全局变量只能在主函数声明,其它模块无法直接访问或者赋值未声明的全局模块,也就避免了大部分局部模块拼写错误的问题。