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

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

对于前者:

 lua_newtable(L); luaL_setfuncs(L, polycoreLib, 0); lua_setglobal(L, "Polycore"); 

这与luaL_openlibluaL_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"