luaL_openlib替换Lua 5.2

时间:2013-09-27 01:13:02

标签: c lua embedding lua-5.2

我正在改编为Lua写的库。 5.2并接到电话我不知道相当于:

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

polycoreLib

的地方
static const struct luaL_Reg polycoreLib []

如何将来电替换为luaL_openlib

仅限lua wiki states

  

应仔细重写诸如luaL_openlib(L, name, lreg, x);之类的调用,因为将搜索具有给定名称的全局表并可能创建该表。

1 个答案:

答案 0 :(得分:31)

这有两个答案:一个用于复制早期版本的行为(创建全局表),另一个用于实现现在常规的行为(即创建并返回匿名表)。 / p>

对于前者:

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"