Подтвердить что ты не робот

Замена luaL_openlib для Lua 5.2

Я адаптирую библиотеку, написанную для Lua < 5.2 и получил вызов Я не знаю эквивалента:

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

Где polycoreLib есть

static const struct luaL_Reg polycoreLib []

Как заменить вызов на luaL_openlib?

Lua wiki только состояния:

Вызовы, такие как luaL_openlib(L, name, lreg, x);, должны быть тщательно переписаны, так как будет создана и, возможно, создана глобальная таблица с заданным именем.

4b9b3361

Ответ 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"