2017-10-06 1 views
1

Ich habe ein Skript, das ich mit loadfile laden und dann ausführen. Auch ich habe die Variable love im Bereich der Eltern Lua Skript und ich möchte diese Variable nil in der Kindskript-Enivorment aber alles andere unberührt (print, math, pairs, alle Standard-Lib von Lua). Wie kann ich das machen?Wie entferne ich eine Variable aus einer untergeordneten Skriptumgebung in lua?

arbeiten Dies gilt nicht:

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

Antwort

1

Ihr Code funktioniert nicht, weil env erbt von _G und so wird env.love in _G aufgelöst. Die Einstellung env.love = nil fügt keinen love Eintrag zu env hinzu.

Set env.love = false oder env.love = {}.

+0

Warum wird es nicht auf "nil" gesetzt? –

+0

Einstellung auf "Null" entfernt einen Eintrag in einer Tabelle. – lhf

+0

aber es nicht - das Kind-Skript kann immer noch 'Liebe' in seinem Umfang verwenden. –

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

Beachten Sie, dass 'setfenv' [wurde in Lua 5.2 entfernt] (https://www.lua.org/manual/5.2/manual.html#8.2). – ComicSansMS

+0

@ComicSansMS - Diese Frage bezieht sich auf Lua 5.1, da der Autor diese Funktion in seinem Code verwendet (siehe auch vorherige Frage dieses Autors). –

+0

@EgorSkriptunoff Einverstanden, ich habe gerade den Kommentar für den Fall hinzugefügt, dass jemand in der Zukunft über diese Frage stolpert und sich fragt, warum Ihre Antwort nicht für sie funktioniert. – ComicSansMS

Verwandte Themen