我想在全球环境中提供一系列功能。添加这些表和C函数后,全局环境应该是只读的。目标是创建可替换的廉价工作环境和静态全局环境。 (静态环境应该包含一些生成时间密集的表。)
从现在起,创建全局变量的调用应转发到local_env
,并且访问不在_G
中的全局变量的调用应转发到local_env
。
为此,我使用以下元表:
local_env = {}
setmetatable(_G, {
__newindex = function(t, v, n)
--print('attempt to write to _G', v, n,
-- 'forward to local env', local_env)
rawset(local_env, v, n)
end,
__index = function(t, k)
--print('attemp to index unknown value', t, k,
-- '-> lookup in local env', local_env)
return rawget(local_env, k)
end,
})
我认为使用rawset
我可以克服这种保护,但我可以忍受这个问题。
运行一些Lua-Code我得到了元函数正在使用的消息:
attempt to write to _G flag function: 42a2fbe4 forward to local env table: 42b91fbc
attempt to write to _G state 0 forward to local env table: 42b91fbc
attemp to index unknown value table: 4298aa2c state -> lookup in local env table: 42b91fbc
但是打印local_env
没有显示任何内容:
for k,v in pairs(local_env) do
print("-- local_env", k,v)
end
我会做什么逻辑错误?
答案 0 :(得分:0)
一般解决方案是将内容从全局表复制到本地环境中,如果您希望它可以访问的话。