1

我想在全局环境中提供一组特定的功能。添加这些表和 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

我会犯什么逻辑错误?

4

1 回答 1

0

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

于 2013-01-16T01:32:22.163 回答