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 代码,我得到一条元函数正在使用的消息:

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

我出了什么逻辑错误?

点赞
用户1113772
用户1113772

一般的解决方案是将全局表中的内容复制到本地环境中,以便使其可访问。


> 一般的解决方案是将全局表中的内容复制到本地环境中,以便使其可访问。
2013-01-16 01:32:22