グローバル環境内で特定の機能セットを提供したいと考えています。これらのテーブルと 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
どのような論理エラーを実行しますか?