2014-01-21 2 views
2

나는 Lua 모듈을 가지고 있는데,이 모듈은 사용되지 않는 모듈 지시어를 사용하지 않고 내보내기 테이블을 반환한다. 또한 "require"함수를 통해 해당 모듈을로드하려는 스크립트가 있습니다. 는 지금은 같은 C 코드에서 루아 상태로 두 파일을로드 : 오히려 이미로드 된 코드보다 파일을 찾습니다 때문에Lua에서 이미로드 된 모듈을 요구하는 방법

luaL_loadstring(lua, someScript); 
lua_pcall(lua, 0, LUA_MULTRET, 0); 
luaL_loadstring(lua, someModule); 
lua_pcall(lua, 0, LUA_MULTRET, 0); 

는, 호출이 실패 필요합니다. 이 상황에서 someScript someModule을 어떻게 든 요구할 수 있습니까?

+0

내 질문과 요청을, 나는 어떤 BTW (당신의 해명에 따라 그 답을 확장한다 코멘트가 아닌 질문에 넣어야합니다.) – Schollii

답변

1

documentation for require에는이 작업에 필요한 모든 정보가 포함되어 있습니다. 특히 require 함수가 요청하는 코드를 찾는 데 사용하는 방법을 알려줍니다. 더 구체적으로는 package.loaded에 대한 첫 번째 문장은주의를 기울이고 싶은 내용입니다. 위의 링크에서

문서는 :

지정된 모듈을로드합니다. 이 함수는 먼저 package.loaded 테이블을 조사하여 modname이 이미로드되었는지 확인합니다. 그럴 경우 require는 package.loaded [modname]에 저장된 값을 반환합니다. 그렇지 않으면 모듈에 대한 로더를 찾습니다.

로더를 찾으려면 package.loaders 배열이 필요합니다. 이 배열을 변경하여 모듈에 대한 요구 사항 검색 방법을 변경할 수 있습니다. 다음 설명은 package.loaders의 기본 구성을 기반으로합니다.

먼저 package.preload [modname]을 쿼리해야합니다. 값이 있으면이 값 (함수 여야 함)이 로더입니다. 그렇지 않으면 package.path에 저장된 경로를 사용하여 Lua 로더를 검색해야합니다. 또한 실패하면 package.cpath에 저장된 경로를 사용하여 C 로더를 검색합니다. 이것도 실패하면 all-in-one 로더를 시도합니다 (package.loaders 참조).

일단 로더가 발견되면 require는 단일 인수 인 modname으로 로더를 호출합니다. 로더가 값을 반환하면 require는 반환 된 값을 package.loaded [modname]에 할당합니다. 로더가 값을 반환하지 않고 package.loaded [modname]에 값을 할당하지 않은 경우 require는이 항목에 true를 할당합니다. 어쨌든 require는 package.loaded [modname]의 최종 값을 반환합니다.

모듈로드 또는 실행 중 오류가 발생하거나 모듈에 대한 로더를 찾을 수없는 경우 오류 신호가 필요합니다.

+0

흠, 모듈의 마지막 문장이 내보내기 테이블을 반환합니다. 필자가 이해하는 것처럼, 파일을 요구하면 어떻게 든 return 문을 호출하고 결과를 package.loaded에 설정합니다. 내가 이해하지 못하는 것은 파일이 이미로드되었을 때 어떻게 엑스포트 테이블에 접근 할 수 있는가하는 것입니다. –

+0

모듈이 테이블을 반환합니다. 'luaL_loadstring'를 호출하면 호출 가능한 청크/함수가 스택에 저장됩니다 (이 함수는 파일을 나타냅니다). 이 함수를'lua_pcall' 할 때 파일에서 코드를 실행하면 파일이 반환하는 값을 반환합니다. 이 경우에는 테이블로 보입니다. 그게 당신이 필요로하는 테이블뿐입니다. –

0

명확하게하기 위해 모듈 A는 내보내기 테이블을 반환합니다. 스크립트 B는 모듈 A가 필요한 문자열이며 B는 아무것도 반환하지 않는다고 가정합니다. 또한 다음을 원합니다.

load script B (via luaL_loadstring): puts chunk on stack 
run chunk for script B (via lua_pcall): puts whatever B returns on stack 
load module A (via luaL_loadstring): puts chunk on stack 
run module A (via lua_pcall): puts whatever A returns on stack 

먼저 모듈 A는 파일이므로 A의 내용을 문자열로로드했을 것입니다.

스크립트 B에서 호출 된 require가 실패한다는 문제가 있다고합니다. B가 'moduleA'를 필요로하지만 moduleA.lua가 LUA_PATH 폴더에서 발견되지 않는 등 여러 가지 이유가있을 수 있습니다. 그래서

:

  • 인쇄 그래서 우리는 그 LUA_PATH이 moduleA하도록되어 있는지 확인하려면 코드
  • 을 볼 수 있습니다 요구 B의 일부입니다.lua를 찾을 수 있습니다.

위의 내용이 확인되면 C API 호출을 살펴볼 수 있지만 문제는 아닌지 의심 스럽습니다. someModulerequire"modname"를 사용

0

경우,이 코드를 시도 : 그래서 질문에 넣어 코멘트에 맞지 않은 사항에 대한

lua_getglobal(lua, "package"); 
lua_getfield(lua, -1, "loaded"); 
luaL_loadstring(lua, someScript); 
lua_pcall(lua, 0, 1, 0); 
lua_setfield(lua, -2, modname); 
luaL_loadstring(lua, someModule); 
lua_pcall(lua, 0, LUA_MULTRET, 0); 
관련 문제