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方法可以跳过元表的元方法。