2013-07-16 1 views
4

: 는 환경 파일을로드하고 반환 나는 다음을 수행하려고 해요

file1 = include(File1.lua) 
A = 1 

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

File2.lua

(아래 포함() 코드)

File1.lua

A = 5 

을 내가 찾고있는 것을 정확히 찾았으나 루아 5.1에서는 여기에있다 : Loadfile without polluting global environment

그러나 내가 그냥 5.2에서 동작하지 않습니다, LoadFile과 같은 지시어의 등록 버전, C++에서이 사용

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

, 그래서 내가이 가능한 기능 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

감사합니다! 나는 내 자신의 버전의 loadfile을 사용했기 때문에 이와 같은 해결책이 없다고 생각했지만 어떻게 감겨 졌는지에 대한 나의 이해는 잘못되었다. – TomB

+0

pcall을 주장하는 것은 의미가 없다. – daurnimator

+0

나는 daurnimator의 의미를 알 수 있습니다. 부적절한 스크립트가 실패 할 생각이라면, 왜'assert (pcall') 비즈니스를 통하지 않고 정기적으로 호출하지 않을까요? – greatwolf

관련 문제