我想在全局环境中提供一组特定的功能。添加这些表和 C-Function 后,全局 env 应该是只读的。目标是创造一个可替代的廉价工作环境和一个静态的全球环境。(静态环境应该包含一些生成时间密集的表。)
从现在开始,创建全局变量的调用应该被转发到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 代码,我收到元函数正在使用的消息:
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
我会犯什么逻辑错误?