问题标签 [lua-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
773 浏览

c - 如何在 C-API 中“%q”格式化 lua_Buffer

string.format ("%q", foo_str) 将格式化一个字符串以添加适当的转义字符,以便安全地读回 Lua 解释器。如何最好地使用此函数从 C-API 格式化 Lua_Buffer?更一般地说,如何从 C-API 访问 string.* 函数?我可以使用lua_pcall ("string.format", ...),但好奇是否有更直接的方法。

0 投票
1 回答
272 浏览

c - 我可以同时初始化和使用两个 Lua 缓冲区吗?

鉴于 LuaL_Buffer 对象:“在其正常操作期间,字符串缓冲区使用可变数量的堆栈槽”,我不明白如何同时使用两个 luaL_Buffer 对象。他们每个人都会假设堆栈的状态是他们需要的吗?换句话说,一个缓冲区可能会在堆栈顶部放置一些东西,并期望它在将来的某个调用中存在,而另一个缓冲区也是如此?不能同时使用两个 LuaL_Buffers 吗?

这是一个同时需要两个缓冲区的操作的示例。它似乎适用于小型测试,但不知道它是否会在生产中站起来。

zlib方法my_uncompress的包装器在哪里

0 投票
1 回答
579 浏览

lua - 寻求“弱 Lua 注册表”

C 有没有办法以与使用引用系统相同的方式引用 Lua 5.2 中的对象,只是这些引用很弱并且可能随时被垃圾收集?换句话说,是否存在一个不影响对象引用计数的所有当前 Lua 对象的注册表?

0 投票
5 回答
9790 浏览

lua - WoW lua API 的主要来源?

我一直在寻找有关魔兽世界插件 API 的第一手资料。有几个很好的 wiki,但它们的参考链接只指向内部。当然,暴雪发布了一些关于该主题的信息。

他们的所有信息真的可以从逆向工程和论坛中收集到吗?这让我很难相信。

0 投票
4 回答
13204 浏览

lua - 使用嵌入式 lua 从 C 代码打印堆栈跟踪

如果我理解正确,Lua 默认会在发生错误时调用调试库“debug.traceback”。

但是,当将 Lua 嵌入到 C 代码中时,就像这里的示例中所做的那样: Simple Lua API Example

我们只有堆栈顶部的错误消息。

IE

初始错误后如何从 C 打印堆栈跟踪?

0 投票
2 回答
955 浏览

lua - 如何迭代使用 luaL_ref 和 luaL_unref 修改的表?

我正在使用 Lua 的 C API 来扩展 Lua。在我的模块中,我想使用 填充表luaL_ref,并使用 删除字段luaL_unref。我也希望能够遍历这个表,希望使用lua_next.

遍历表是一个问题,因为luaL_unref. 在 Lua 中,通过赋值来“删除”表字段是很常见的nil(因为未初始化的表字段评估为nil)。该next功能足够聪明,可以跳过nil。我本来希望luaL_unref分配nil给未引用的表字段,但它似乎分配了一个整数。这个整数的值似乎没有记录。

考虑以下代码:

输出:

这里发生了什么?我该如何解决这个问题?是否有一些技巧可以迭代引用并忽略未引用的?我必须停止使用luaL_refandluaL_unref吗?


编辑

首先,感谢您的回复!

也许我问错了问题。

请允许我说得更具体一点。我有一个需要管理许多订阅用户数据的客户端用户数据。订阅由客户端的 subscribe 方法创建。订阅由客户端的取消订阅方法删除。订阅用户数据基本上是一个实现细节,因此它们不会暴露在客户端 API 中。相反,客户端 API 使用订阅引用,因此使用luaL_ref来填充订阅表。

这就是问题所在。我希望客户端自动取消订阅 __gc 上的所有剩余订阅(否则用户将收到段错误)。所以看来我需要遍历订阅。我真的在这里滥用 API 吗?有一个更好的方法吗?

0 投票
1 回答
849 浏览

c++ - 在 C api 中移动 lua 表

我正在尝试使用 lua C api 将表移动到另一个表。例如,我有一个具有这种结构的表:

我想将表 d 移动到 a[b] 下,我可以在 Lua 中完成,例如:

我目前的方法是在堆栈上加载 a[b][c][d] 表,所以堆栈看起来像:

然后将 a[b] 加载到堆栈中,如下所示:

然后将d的key放入栈中,将d的key和表b插入到表d下,所以栈为:

然后我使用 lua_settable(L, -3) 来做 b[d] = d。

这种方法适用于非表键,但不适用于表键。所以它会失败,比如:

注意,我知道上面给出的 lua 会失败,因为键是一个新的 lua 表,我只是想说明一下。

我已经尝试过从父母那里下去(这样做a [b] = b,lua_setglobal(L,a))也没有任何运气。有谁知道我要去哪里错了?

编辑:关于我如何将键/值推入堆栈的小代码片段。这里的目标是将一个表从一个表结构移动到另一个表结构(或者正如我在代码中所说的那样,重新定义它)

http://pastebin.com/Y4540Wss

解决方案:

问题是该表具有一些阻止更改表的元表函数(本质上,制作脚本的人有一个结构很重要的配置表,因此导致了这个问题。)

0 投票
1 回答
300 浏览

c++ - Lua C API:插入表格元素导致调试断言失败

函数成功返回,我可以使用表中的值,但出现错误“调试断言失败”,这就结束了。我知道 assert 的问题出在 for 循环中,但不完全知道如何解决。提前致谢。

编辑:当我设置 int i; 在 0 上它可以工作,但忘记了最后一个元素。如果 i == 1 为什么不这样做?

lua_rawseti(L,-2,i);出现断言失败时 我== 1

由于没有解决我的问题的解决方案,我将尝试描述它的作用以及这两种情况下的输出。我只是想从 xml 文件中的指定节点获取所有值:

脚本如下所示:

问题:

诠释 i = 1;

输出:

A B C D !!!调试断言失败!!!

-------------------------------------------------- ----

诠释 i = 0;

输出:

B C D 没有错误...

0 投票
1 回答
150 浏览

lua - 使用 c-api 修改 Lua 表的值

lua中的表定义如下

Lua 调用 ac 函数,并将 tab 表设置为参数,这个 c 函数应该返回更新后的表

我想修改所有字符串值并将它们设置为“DEFAULT”,并将修改后的表返回到 lua。

C代码

Lua 代码

结果

字符串值仍然具有初始值,而它应该已默认为“DEFAULT”

0 投票
1 回答
3196 浏览

c++ - 如何在运行之前通过 lua C API 为一大块 lua 代码设置环境表?

我的游戏引擎的界面是使用标记语言和 Lua 构建的,类似于 HTML 和 javascript。因此,视觉元素将具有用于 UI 事件(例如鼠标移动或单击)的处理程序,并且每次运行处理程序时,引擎将检查它是否已编译,如果尚未编译,则通过luaL_loadstring. Handers 可以通过元素复制或赋值 ( this.onclick = that.onclick) 共享。

如何在运行之前设置一大块lua代码的环境?这个想法是使特定于元素和事件的数据可用于块,并链接到父 UI 元素的环境。 Lua 5.2 changes removed lua_setfenv,所以我不知道如何实现这一点。该函数lua_load允许指定一个环境,但似乎只用于加载代码而不是运行它。