2016-10-27 1 views
2

프로젝트 광산의 구성 형식으로 Lua를 사용하고 있습니다. 이제 나는 다음과 같은 인위적인 예를 들어 있다고 가정합시다, 우리는 conf.lua 전화 할게 :특정 범위에서로드 된 Lua 파일 실행

title = "Lorem Ipsum" 
author = "John Doe" 
date = "01 January 2000" 

을 이제 사소, 나는 물론과 같이이 파일을로드 할 수

dofile("conf.lua") 

그러나, 이것에 문제가 이 정의는 전역 네임 스페이스에 설정되어 있습니다. 나는 원하지 않습니다. 또한, 그것은 전체로서 상이한 변수에 액세스하는 것을 어렵게 만든다 (예를 들어, 설정 변수 세트에 대한 루프). 하나 개의 솔루션과 같이 conf.lua를 다시 작성하는 것입니다 :

local conf = { 
    title = "Lorem Ipsum", 
    author = "John Doe", 
    date = "01 January 2000" 
} 

return conf 

차례로

, 다음 코드를 사용하여 부하 conf.lua는 :

local configuration = dofile("conf.lua") 

그러나, 이것은 내가 분명한 이유를 생각하기위한 비 이상적입니다. 내 사용자는 쉼표를 추적하여 끝에 테이블을 반환해야한다는 것을 기억하기 위해 local을 작성해야합니다. 어떤 종류의 사용자 지정 범위로 conf.lua을 실행하게하는 방법이 있다면 좋을 것입니다.

답변

3

dofile을 사용하는 대신 loadfile을 사용하면됩니다.

loadfile

당신이 environment로드 덩어리가 빈 테이블로이 설정. 실행 upvalues ​​이 해당 테이블에 배치 될 수 있도록 할 것입니다 지정할 수 있습니다. 대신 문자열 또는 문자열 건물 함수에서, stdin 파일에서 청크를로드하거나 제외

local function load_conf() 
    local env = {} 

    local chunk, err = loadfile('conf.lua', 'bt', env) 

    if not err then 
     chunk() 
    end 

    return env, err 
end 

local conf, conf_err = load_conf() 

print(conf_err) 
print(conf.title, conf.author, conf.date) 

loadfileload와 유사한 규칙을 사용합니다. setfenvLua 5.1와 이전 버전과의 호환성을 위해 필요하다고


참고. 로드 된 청크를 실행하기 전에 다음과 같은 것을 사용하십시오.

if setfenv then 
    setfenv(chunk, env) 
end 

Lua 5.2 Reference Manual§8.1 – Changes in the Language 참조하십시오.


마지막으로, 설정 파일은 메인 프로그램을 충돌하지 않도록 pcall를 사용하여, 보호 모드에 덩어리를 실행 해보십시오.

관련 문제