1

グローバル環境内で特定の機能セットを提供したいと考えています。これらのテーブルと 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

どのような論理エラーを実行しますか?

4

1 に答える 1

0

一般的な解決策は、アクセス可能にしたい場合は、グローバル テーブルからローカル環境にコピーすることです。

于 2013-01-16T01:32:22.163 に答える