2013-07-16 2 views
4

Я пытаюсь сделать следующее: (код включать() ниже)Загрузка файла и возвращает его окружение

File1.lua

A = 5 

File2.lua

file1 = include(File1.lua) 
A = 1 

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

я нашел именно то, что я ищу, но в lua 5.1 здесь: Loadfile without polluting global environment

Но я просто не могу заставить его работать в 5.2,

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

Используя это из C++, с зарегистрированной версии LoadFile, поэтому я стараюсь не изменять функции call.Is это возможно? Независимо от того, что я пытаюсь перерывы или env, имеет значение null.

ответ

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

Спасибо! Я не думал, что такое решение будет работать, потому что я использовал свою собственную версию загрузочного файла, но мое понимание того, как оно было обернуто, было неправильным ... – TomB

+0

Утверждение pcall не имеет никакого смысла. – daurnimator

+0

Я вижу, что означает сунниматор. Если вы намереваетесь неудачно сформировать скрипты, почему бы просто не называть это регулярно, а не проходить через весь 'assert (pcall' business? – greatwolf

Смежные вопросы