2013-07-16 7 views
4

je tente de faire ce qui suit: (code include() ci-dessous)Charger un fichier et retourner son environnement

File1.lua

A = 5 

File2.lua

file1 = include(File1.lua) 
A = 1 

print(A) -- 1 
print(file1.A) -- 5 

J'ai trouvé exactement ce que je cherche mais en lua 5.1 ici: Loadfile without polluting global environment

Mais je ne peux pas le faire fonctionner en 5.2,

function include(scriptfile) 
local env = setmetatable({}, {__index=_G}) 
assert(pcall(setfenv(assert(loadfile(scriptfile)), env))) 
setmetatable(env, nil) 
return env 
end 

L'utilisation de ce à partir de C++, avec une version enregistrée de loadfile, donc j'essaie de ne pas modifier la fonction call.Is ce possible? Quoi que j'essaie, les breaks ou env sont null.

Répondre

5

File2.lua

function include(scriptfile) 
    local env = setmetatable({}, {__index=_G}) 
    assert(loadfile(scriptfile, 't', env))() 
    return setmetatable(env, nil) 
end 

file1 = include'File1.lua' 
A = 1 

print(A)  -- 1 
print(file1.A) -- 5 
+0

Merci! Je ne pensais pas qu'une telle solution fonctionnerait parce que j'utilisais ma propre version du fichier de chargement, mais ma compréhension de la manière dont elle était emballée était erronée ... – TomB

+0

Affirmer que pcall n'a aucun sens. – daurnimator

+0

Je peux voir ce que signifie daurnimator. Si vous avez l'intention de faire échouer des scripts mal formés, pourquoi ne pas l'appeler régulièrement au lieu de passer par l'ensemble de 'assert (pcall' business? – greatwolf

Questions connexes