Lua,metatable,影子环境

时间:2012-11-15 14:14:50

标签: lua

我想在全球环境中提供一系列功能。添加这些表和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

我会做什么逻辑错误?

1 个答案:

答案 0 :(得分:0)

  

一般解决方案是将内容从全局表复制到本地环境中,如果您希望它可以访问的话。