相信用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”)获取调用的堆栈,如果不在主函数访问或者赋值新的全局变量,则抛出日志,提示开发者修改。
这就保证了全局变量只能在主函数声明,其它模块无法直接访问或者赋值未声明的全局模块,也就避免了大部分局部模块拼写错误的问题。
本文介绍了一种使用Lua元表和debug库防止局部变量误作为全局变量使用的技巧,通过设置全局表_G的metatable,在访问或赋值不存在的全局变量时抛出日志,确保全局变量仅在主函数中声明。
1792

被折叠的 条评论
为什么被折叠?



