2013-09-27 11 views
21

jestem dostosowania biblioteki napisane dla Lua < 5,2 i dostał się do rozmowy nie wiem równowartość:wymiana luaL_openlib dla Lua 5,2

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

Gdzie polycoreLib jest

static const struct luaL_Reg polycoreLib [] 

Jak mogę zamienić połączenie na luaL_openlib?

lua wiki tylko states:

zwraca takie jak luaL_openlib(L, name, lreg, x); należy starannie przepisany, ponieważ globalna tabela o podanej nazwie zostaną przeszukane i ewentualnie utworzony.

Odpowiedz

28

tam dwie odpowiedzi do tego: jeden do replikacji zachowanie wcześniejszych wersjach tutaj (gdzie stół globalny jest tworzony), a jeden za wdrażanie zachowanie, które jest obecnie konwencjonalnych (który jest stworzenie i powrócić anonimowy stół).

Dla tych pierwszych:

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

Nie dość jest taka sama jak luaL_openlib, bo jeśli istnieje istniejąca globalna tabela Polycore będzie zastąpienie go zamiast połączenia z nim. Jeśli scalanie jest problemem, należy lua_getglobal pierwsze, a następnie, jeśli to pchnął stół ponownego wykorzystywania, że ​​zamiast tworzyć nowe:

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"); 

Ten ostatni jest łatwiej, bo nie trzeba się martwić o połączenia:

lua_newtable(L); 
luaL_setfuncs(L, polycoreLib, 0); 
return 1; 

z takim podejściem, to reponsibility rozmówcy związać tablicę, jak w:

local Polycore = require "Polycore" 
+0

Więc mam wiele obiektów, które są dodawanie własnych funkcji wywołania globalnej biblioteki. Próba odkrycia, jak to zrobić w 5.3, zawsze prowadzi mnie z powrotem do tej odpowiedzi, ale ta odpowiedź nie zawiera wystarczających informacji. Pierwszy blok kodu zastępuje poprzednie wpisy. Poprawka, która powoduje problemy z odniesieniem do zera w wywołaniu lua_getglobal() i nie widzę, jak ostatnia robi jakąkolwiek wyszukiwarkę LUB wiąże się z nazwą "Ploycore". czego mi brakuje? – James

+0

Dodatkowo powrót 1 na końcu sprawia, że ​​ma się wrażenie, że jest w luaopen_Polycore() wywołanie ... Czy mogę utworzyć moje meta table tam po luaL_newlib() zadzwoń bezpiecznie? (Otrzymywałem moje wywołania gettop() by się myliły). (i luaL_newlib() to wrapper dla lua_newtable() luaL_setfuncs() połączeń .. kinda) – James

+2

@ luames 'luaL_setfuncs' używa tabeli na górze stosu. Tak więc łączenie z istniejącą tabelą wymaga tylko umieszczenia tej tabeli na stosie zamiast nowej tabeli. Jeśli pobrana tabela jest już dostępna z globalnej nazwy, pozostanie dostępna z globalnej nazwy. Oczywiście nie można łączyć tabel z tymi samymi kluczami. Jeśli potrzebujesz tego (lub podtabeli), musisz jakoś to zrobić ręcznie. (Stoły podrzędne są łatwe, ponieważ właśnie tworzysz nową tabelę i wstawiasz ją do pobranego stołu.) –