Lua、元表、阴影环境
我想在全球环境中提供一组特定的功能。添加这些表和C函数后,全局env应为只读。我们的目标是创造一个可替代的廉价工作环境和一个静态的全球环境。(静态环境应包含一些需要大量时间才能生成的表。) 从现在起,创建全局变量的调用应转发到Lua、元表、阴影环境,lua,Lua,我想在全球环境中提供一组特定的功能。添加这些表和C函数后,全局env应为只读。我们的目标是创造一个可替代的廉价工作环境和一个静态的全球环境。(静态环境应包含一些需要大量时间才能生成的表。) 从现在起,创建全局变量的调用应转发到local\u env,访问不在\u G中的全局变量的调用应转发到local\u env 为此,我使用以下元表: local_env = {} setmetatable(_G, { __newindex = function(t, v, n) --print('a
local\u env
,访问不在\u G
中的全局变量的调用应转发到local\u 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代码时,我会收到元函数正在使用的消息:
尝试写入标志函数:42a2fbe4转发到本地环境表:42b91fbc
尝试写入状态0转发到本地环境表:42b91fbc
尝试索引未知值表:4298aa2c状态->在本地环境表中查找:42b91fbc
但是打印local_env
不会显示任何内容:
for k,v in pairs(local_env) do
print("-- local_env", k,v)
end
我应该做什么逻辑错误
一般的解决方案是,如果希望全局表中的内容可以访问,就将其复制到本地环境中
在这种情况下,不必使用
rawget
/rawset
。但这也没有害处。您的代码似乎没有任何错误:它适合我。如果您不关心打印
,您甚至可以简化:setmetatable(\u G,{{uuuunewindex=local\u env,{uuuuu index=local\u env})
我真丢脸!!我被自己的想法愚弄了!!我在执行开始时使用了打印-愚蠢。在移动到最后后,我工作了…请注意:每个表只能有一个元表。而且由于_G通常是共享的…@Nicolas:你有什么建议?对于我的问题,什么更合适的解决方案?