2010-04-28 4 views
2

다음에 명명 된 테이블에 Lua 스크립트를로드합니다. 내 게임에서 luaL_loadfilelua_pcall을 사용하여 스크립트를로드하고, 전역 테이블에로드하는 대신 파일 이름을 가진 테이블에로드 할 수 있는지 궁금합니다.파일 이름

Foo.DoSomething() 
: 나는 그것을 좋아에 액세스 할 수 있도록하려면를로드 한 후

function DoSomething() 
    --something 
end 

: 나는이 포함 "Foo.lua", 호출 된 파일이

: 예를 들어

감사!

답변

6

다음과 같이 시도해보십시오. 오류 검사를 추가하는 것을 잊지 마십시오.

lua_newtable(L); 
lua_setglobal(L,filename); 
luaL_loadfile(L,filename); 
lua_getglobal(L,filename); 
lua_setfenv(L,-2); 
lua_pcall(L,...); 
+0

이 후에 환경을 설정해야합니까? 왜냐하면 내가이 함수를 호출 할 때 나는 다음과 같은 결과를 얻었 기 때문이다 : "글로벌 'print'(nil 값) 호출 시도" –

+0

아, 맞다. 내가 제공 한 코드는 해당 스크립트의 전역 변수를 빈 테이블로 바꾸고 인쇄하지 않습니다. 두 가지 해결책을 보았습니다. __index 메타 메소드를 _G를 가리키는 해당 테이블에 추가하거나 lua_pcall 전에 _G에 __newindex 메소드를 추가하여 스크립트의 모든 정의가 테이블로 이동하도록하십시오. 먼저 Lua를 사용하여 프로토 타입을 작성한 다음 C로 이동하십시오. – lhf

+0

자세한 설명 (Lua로 작성)은 [lua-users 메일 링리스트] (http://lua-users.org/lists/lua)에서 찾을 수 있습니다. -l/2006-05/msg00121.html) – akciom

4

루아 코드 자체에 의해 결정됩니다 - 파일이 전역 네임 스페이스에서 선언하면 pcall을 통해 파일을 실행할 때 전역 네임 스페이스로 이동합니다.

가장 간단한 옵션은 Lua 파일을 작성하는 사람이 자신의 네임 스페이스를 만들도록 권장하는 것입니다 (파일의 시작 부분에 Foo = {}, 나중에 Foo.whatever로 함수를 선언하는 것).

을 개인 네임 스페이스에 적용하려면 기본적으로 파일을 실행 한 후 글로벌 네임 스페이스에서 변경된 항목을 찾아 수동으로 새 항목을 비공개로 이동해야합니다 대신 네임 스페이스.