luaL_openlib替换Lua 5.2

App*_*ell 22 c lua embedding lua-5.2

我正在调整为Lua <5.2编写的库,并接到一个我不知道相当于的电话:

luaL_openlib(L, "Polycore", polycoreLib, 0);
Run Code Online (Sandbox Code Playgroud)

哪里polycoreLib

static const struct luaL_Reg polycoreLib []
Run Code Online (Sandbox Code Playgroud)

如何将呼叫替换为luaL_openlib

lua wiki只:

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

Tox*_*rog 31

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

对于前者:

lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
Run Code Online (Sandbox Code Playgroud)

这是不是一样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");
Run Code Online (Sandbox Code Playgroud)

后者更容易,因为您不需要关心合并:

lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;
Run Code Online (Sandbox Code Playgroud)

使用这种方法,调用者可以重新绑定表,如下所示:

local Polycore = require "Polycore"
Run Code Online (Sandbox Code Playgroud)

  • @James`luaL_setfuncs`使用堆栈顶部的表.因此,与现有表合并只涉及将该表放在堆栈而不是新表.如果已从全局名称获取该获取的表,则它将从全局名称保持可用.显然,您无法使用相同的键合并表.如果您需要(或子表),那么您需要以某种方式手动处理.(子表很简单,因为您只需创建一个新表并将其插入到获取的表中.) (3认同)
  • 是的,你可以在luaopen_Polycore调用中做任何你需要的事情,你只需要在最后得到你的堆栈.提出一个引用这个问题的新问题并添加lua 5.3位和你的额外目标并显示你尝试过的代码而不是回答这些已回答的问题也可能更有意义(因为对此的新答案不一定能回答原问的问题). (2认同)