2013-07-16 13 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這可能嗎? 無論我嘗試休息或環境爲空。

回答

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

我可以看到daurnimator的含義。如果你打算使用格式不正確的腳本失敗,爲什麼不定期調用它,而不是通過整個'assert(pcall' business? – greatwolf