2017-10-06 5 views
1

J'ai un script que je charge avec loadfile, puis exécutez-le. J'ai aussi la variable love dans la portée du script parent lua et je veux que cette variable soit nil dans l'enivornment du script enfant mais tout le reste (print, math, pairs, toutes les libs sta de Lua). Comment puis je faire ça?Comment supprimer une variable de l'environnement de script enfant dans lua?

Cela ne fonctionne pas:

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

Répondre

1

Votre code ne fonctionne pas parce que env hérite de _G et ainsi env.love est résolu dans _G. Le réglage env.love = nil n'ajoute pas d'entrée love à env.

Définissez env.love = false ou env.love = {}.

+0

Pourquoi le mettre à "nil" ne l'ajoute-t-il pas? –

+0

La définition de 'nil' supprime une entrée dans une table. – lhf

+0

mais ce n'est pas le cas - le script enfant peut toujours utiliser 'love' dans sa portée. –

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

Notez que 'setfenv' [a été supprimé dans Lua 5.2] (https://www.lua.org/manual/5.2/manual.html#8.2). – ComicSansMS

+0

@ComicSansMS - Cette question concerne Lua 5.1, car l'auteur utilise cette fonction dans son code (regardez aussi la question précédente de cet auteur). –

+0

@EgorSkriptunoff D'accord, je viens d'ajouter le commentaire au cas où quelqu'un trébucherait à travers cette question à l'avenir et se demande pourquoi votre réponse ne fonctionne pas pour eux. – ComicSansMS