2013-09-27 10 views
21
내가 루아 < 5.2 용으로 작성된 라이브러리를 적응하고 있고 전화에 도착 내가하는 것과 모르는

: polycoreLibluaL_openlib 교체 5.2

static const struct luaL_Reg polycoreLib [] 

인 경우

luaL_openlib(L, "Polycore", polycoreLib, 0); 

luaL_openlib으로 전화를 대체하려면 어떻게해야합니까?

루아 위키는 states : 주어진 이름의 글로벌 테이블이 검색 가능성이 생성되기 때문에 같은 luaL_openlib(L, name, lreg, x); 같은

전화는주의 깊게 다시 작성해야합니다.

답변

28

여기에는 두 가지 답변이 있습니다. 하나는 이전 버전의 동작 (전역 테이블 작성 위치)을 복제하기위한 것이고, 다른 하나는 익숙한 테이블을 만들고 반환하는 기존의 동작을 구현하는 것입니다.). 전자의 경우

: 기존 글로벌 테이블 Polycore가있는 경우는 오히려 합병보다 덮어 쓰기 때문에

lua_newtable(L); 
luaL_setfuncs(L, polycoreLib, 0); 
lua_setglobal(L, "Polycore"); 

이 아니라 아주luaL_openlib과 동일합니다. 병합이 필요한 경우는 테이블 재사용을 밀어 있다면, 먼저 lua_getglobal를 사용하는 대신 만드는 것보다 새로운 :

lua_getglobal(L, "Polycore"); 
if (lua_isnil(L, -1)) { 
    lua_pop(L, 1); 
    lua_newtable(L); 
} 
luaL_setfuncs(L, polycoreLib, 0); 
lua_setglobal(L, "Polycore"); 

당신이 병합에 대해 신경 쓸 필요가 없기 때문에 후자가 더 쉽다 :

local Polycore = require "Polycore" 
+0

그래서 나는 자신의 함수는 전역 라이브러리 호출을 추가하는 여러 개체가이 방법으로
lua_newtable(L); luaL_setfuncs(L, polycoreLib, 0); return 1; 

, 같이 테이블을 결합하는 호출자의 책임 지표입니다. 5.3에서이 작업을 수행하는 방법을 파악하려고 시도하면 항상이 답변으로 돌아 오지만이 대답에는 충분한 정보가 없습니다. 첫 번째 코드 블록은 이전 항목을 덮어 씁니다. 이 문제에 대한 픽스는 lua_getglobal() 호출에서 nil 참조 문제를 던져 버리고, 마지막 호출이 어떤 종류의 조회를 수행하는지 또는 "Ploycore"라는 이름에 바인딩하는 방법을 알지 못합니다. 내가 뭘 놓치고 있니? – James

+0

또한 마지막에 1을 ​​반환하면 luaopen_Polycore() 호출에있는 것처럼 느껴집니다 ... luaL_newlib() 호출 후 안전하게 메타 테이블을 만들 수 있습니까? (나는 잘못된 gettop() 호출을 받고있었습니다.) (그리고 luaL_newlib()은 lua_newtable() luaL_setfuncs() 호출을위한 래퍼입니다.) – James

+2

@James'luaL_setfuncs'는 스택 맨 위에있는 테이블을 사용합니다. 따라서 기존 테이블과 병합하는 것은 새 테이블 대신 해당 테이블을 스택에 넣는 것입니다. 가져온 테이블이 이미 전역 이름에서 사용 가능한 경우 전역 이름에서 계속 사용할 수 있습니다. 분명히 테이블을 같은 키로 병합 할 수는 없습니다. 그 (또는 서브 테이블)가 필요하면 수동으로 어떻게 든 처리해야합니다. (새 테이블을 만들고 가져온 테이블에 삽입하기 만하면 서브 테이블을 쉽게 사용할 수 있습니다.) –