2017-10-06 4 views
1

私はloadfileでロードしたスクリプトを実行しています。また、親luaスクリプトのスコープに変数loveがあります。この変数を子スクリプトのenivornment内にnilとしたいのですが、それ以外はすべて手を触れないでください(printmathpairs、すべてのLuaの標準ライブラリ)。どうやってやるの?luaの子スクリプト環境から変数を削除するには?

これは動作しません:

local scenario = love.filesystem.load(script) 
local env = {} 
setmetatable(env, { __index = _G }) 
env.love = nil 
env.game = Game 
setfenv(scenario, env) 

答えて

1

_Gのでenv.loveからenv継承が_Gで解決されているため、あなたのコードは動作しません。 env.love = nilを設定すると、にloveのエントリが追加されません。

セットenv.love = falseまたはenv.love = {}

+0

これを 'nil'に設定するのはなぜですか? –

+0

'nil'に設定すると、テーブル内のエントリが削除されます。 – lhf

+0

しかし、それはしません - 子スクリプトはまだその範囲で '愛'を使用することができます。 –

2
local scenario = love.filesystem.load(script) 
local env = setmetatable({}, { __index = 
    function(t, k) 
     if k == "love" then 
     return nil 
     else 
     return _G[k] 
     end 
    end 
}) 
setfenv(scenario, env) 
+0

'setfenv'は[Lua 5.2で削除されました](https://www.lua.org/manual/5.2/manual.html#8.2)に注意してください。 – ComicSansMS

+0

@ComicSansMS - この質問は、作者がこの関数をコードで使用するので、Lua 5.1に関するものです(この著者の以前の質問も参照してください)。 –

+0

@EgorSkriptunoff合意しました。私は、誰かが将来この問題を突き抜けて、あなたの答えがなぜ彼らにとってうまくいかないのか不思議に思うような場合に、コメントを追加しました。 – ComicSansMS

関連する問題