2012-11-15 53 views
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 

办什么逻辑错误?

+1

在这种情况下,没有必要使用'rawget' /'rawset'。但它也没有伤害。你的代码似乎没有任何错误:它适用于我。 – prapin

+2

如果你不关心'print',甚至可以简化:'setmetatable(_G,{__newindex = local_env,__index = local_env})' – prapin

+0

对我感到羞耻!我被我自己的概念愚弄了!我在执行开始时使用了印刷品 - 很愚蠢。移动到最后我工作... – Mario

回答

0

The general solution is to copy stuff from the global table into the local environment if you want it to be accessible.