замена luaL openlib для Lua 5.2
я адаптирую библиотеку, написанную для Lua
luaL_openlib(L, "Polycore", polycoreLib, 0);
здесь polycoreLib
это
static const struct luaL_Reg polycoreLib []
как я могу заменить вызов luaL_openlib
?
только Вики lua государства:
вызовы, такие как
luaL_openlib(L, name, lreg, x);
следует тщательно переписать, потому что глобальная таблица с заданным именем будет найдена и, возможно, создана.
1 ответов
на это есть два ответа: один для репликации поведения более ранних версий здесь (где создается глобальная таблица), и один для реализации поведения, которое теперь является обычным (которое должно создать и вернуть анонимную таблицу).
для бывшего:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
это не совсем аналогично luaL_openlib
, потому что если существует глобальная таблица Polycore
он будет перезаписывать его, а не сливаться с ним. Если слияние является проблемой, используйте 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");
последняя легче, потому что вам не нужно заботиться о слиянии:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;
при таком подходе, это ответность вызывающего абонента, чтобы связать таблицу, как в:
local Polycore = require "Polycore"