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
辦什麼邏輯錯誤?
在這種情況下,沒有必要使用'rawget' /'rawset'。但它也沒有傷害。你的代碼似乎沒有任何錯誤:它適用於我。 – prapin
如果你不關心'print',甚至可以簡化:'setmetatable(_G,{__newindex = local_env,__index = local_env})' – prapin
對我感到羞恥!我被我自己的概念愚弄了!我在執行開始時使用了印刷品 - 很愚蠢。移動到最後我工作... – Mario