setmetatable(_G,{
__newindex = function(t,n,v)
local w = debug.getinfo(2,"S").what
if w ~= "main" and w ~= "C" then
error("attempt to write to undeclared variable"..n,2)
end
rawset(t,n,v)
end,
__index = function(_,n)
error("not exsits "..n,2)
end
})
a = 100
print(a)因为全局变量都是保存在一个_G的table中的,所以可以改变它的元方法达到限制新索引的添加
rawset和rawget方法可以跳过元表的元方法。