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) 这样的调用应该仔细重写,因为将搜索给定名称的全局表,并可能创建表。

点赞
用户2755919
用户2755919

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

对于前者:

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-27 01:22:25