замена 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"