2012-11-15 55 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.