1
我想在全球环境中提供一些特定的功能。添加这些表和C函数后,全局env应该是只读的。目标是制造一个可替换的廉价工作环境和一个静态的环境。 (静态环境应包含一些表是时间密集的产生。)Lua,metatable,shadow environment
从现在开始呼吁创建全局变量应该转发给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
办什么逻辑错误?
在这种情况下,没有必要使用'rawget' /'rawset'。但它也没有伤害。你的代码似乎没有任何错误:它适用于我。 – prapin
如果你不关心'print',甚至可以简化:'setmetatable(_G,{__newindex = local_env,__index = local_env})' – prapin
对我感到羞耻!我被我自己的概念愚弄了!我在执行开始时使用了印刷品 - 很愚蠢。移动到最后我工作... – Mario