luaL_openlib 替代 Lua 5.2

Posted

技术标签:

【中文标题】luaL_openlib 替代 Lua 5.2【英文标题】:luaL_openlib replacement for Lua 5.2 【发布时间】:2013-10-03 04:30:04 【问题描述】:

我正在改编一个为 Lua

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】:

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

对于前者:

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"

【讨论】:

所以我有多个对象将它们自己的函数调用添加到全局库中。试图弄清楚如何在 5.3 中做到这一点总是让我回到这个答案,但这个答案对我来说没有足够的信息。第一个代码块覆盖以前的条目。对此的修复会在 lua_getglobal() 调用中引发 nil 引用问题,并且我看不到最后一个如何进行任何类型的查找或绑定到名称“Ploycore”。我错过了什么? 另外,最后的 return 1 让人觉得它应该在 luaopen_Polycore() 调用中......我可以在 luaL_newlib() 调用之后安全地在那里创建元表吗? (我的 gettop() 调用是错误的)。 (而 luaL_newlib() 是 lua_newtable() luaL_setfuncs() 调用的包装器......有点) @James luaL_setfuncs 使用堆栈顶部的表格。因此,与现有表合并只需将该表放入堆栈而不是新表。如果该获取的表已经可从全局名称获得,那么它将保持可从全局名称获得。显然,您不能合并具有相同键的表。如果您需要它(或子表),那么您需要以某种方式手动处理它。 (子表很容易,因为您只需创建一个新表并将其插入到获取的表中。) 是的,你可以在 luaopen_Polycore 调用中做任何你需要的事情,你只需要在最后得到你的堆栈。提出一个引用这个问题的新问题并添加 lua 5.3 位和您的额外目标并显示您尝试过的代码而不是赏金这个已回答的问题也可能更有意义(因为对此的新答案不一定会回答最初提出的问题)。

以上是关于luaL_openlib 替代 Lua 5.2的主要内容,如果未能解决你的问题,请参考以下文章

lua State加载部分库

使用 C++ 访问 Lua 全局表

C调用lua文件中函数

Lua 文件中的预定义函数在哪里?

Lua 5.2 - utf8降低功能 - 是否有纯粹的lua实现?

Lua的语法缺失及替代措施