24

我正在改编一个为 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);应该仔细重写诸如此类的调用,因为将搜索并可能创建具有给定名称的全局表。

4

1 回答 1

33

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

对于前者:

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"
于 2013-09-27T01:22:25.777 回答