问题标签 [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 投票
2 回答
1204 浏览

lua - Lua中混合类型的等式运算符

在 Lua 编程的第 13.2 章中指出

与算术元方法不同,关系元方法不支持混合类型。

同时

仅当被比较的两个对象共享此元方法时,Lua 才调用相等元方法

所以我正在用 C 实现我的库,并希望能够支持类似的行为

通过提供

哪个似乎不起作用,有解决方法吗?
注意: my_equal 能够在它的任何参数中处理 A 类型和 B 类型的用户数据

更新:元表注册:

申请代码:

0 投票
1 回答
175 浏览

c++ - Lua C++ 用户数据矩阵访问元素

我在 C++ 中有一个矩阵类,构造函数如下:

我已经实现了 set 和 get 方法,如下所示:

矩阵类可以从 Lua 访问;但是,我可以从 Lua 访问矩阵元素的唯一方法是,如果 m 是矩阵,m:GetValue 或 m:SetValue。

我想知道是否可以通过符号 m[1,2] 或 m(1,2) 访问(设置)矩阵元素,其中 m 是矩阵,[1,2] 是第一行的元素,并且第二列。

0 投票
1 回答
392 浏览

c - 如何在 C 语言的 Lua 模块中创建 Lua 模块?

我有一个Actor我想给一个Script.

我不想拥有多个共享对象,而是希望拥有一个包含其自身依赖项的顶级模块。

换句话说,我希望能够做到这一点:

这两个都简单地返回创建和类型userdata的函数。我的问题是,虽然我可以加载此代码,但它不能按预期工作。似乎只是以某种方式返回了一个。ActorActor.ScriptScriptActor userdata

我期待:

如果我将代码“分解”到两个不同的模块中,我会得到预期的结果,但我真的很想把它放在一个模块中。

我在 OSX 和 Clang 上编译:

这是我正在使用的代码:

演员.c:

脚本.c:

常见的.h:

0 投票
2 回答
472 浏览

c - Lua注册的C函数调用另一个

假设我在 Lua 范围内注册了两个 C 函数:

问题是:我可以func2在内部打电话func1吗?

我发现如果将多个参数传递给func1,则lua_gettop()返回的值func2毫无意义。

例如,如果func1在我的 lua 脚本中传递了 3 个参数,则lua_gettop()返回 3 in func1,并且不少于 3 in func2。这绝对是错误的,因为lua_gettop()应该返回传递给当前函数的参数数量。

那么我应该在调用之前做任何堆栈技巧,func2例如设置新的堆栈框架,还是根本不应该这样做?

0 投票
2 回答
834 浏览

c - 在 Lua 注册表中存储 C 结构

当我将 Lua 集成到我的 C 程序中时,我一直在使用static指向 C 结构的指针来存储我需要在绑定到 Lua 状态的方法中重用的对象。

但是,一旦我将 Lua 库从主程序中拆分出来,这将不起作用,因此我似乎需要使用注册表来存储我的结构。

如何将我的 C 结构指针存储在 Lua 注册表中?

这就是我目前正在做的事情:

编辑:从我在 IRC 上得到的答案看来,我应该使用metatable,所以我目前正在研究这个。

0 投票
2 回答
619 浏览

c - 在 C 中编写面向 Lua 的函数时,检查参数是否支持类似表的查找的好方法是什么?

这是一个可以检查参数是否为表的潜在模式:

每当第一个参数是表格时,这都有效。但是,其他 Lua 类型支持表查找,例如 userdata,在 luajit 中支持 cdata。

lua_getfield有没有一种很好的方法可以在我调用它之前检查表查找(例如 via )是否会成功?我的意思是不将类型限制为表格。相关地,表、userdata 和 cdata 是 luajit 中唯一支持索引查找的类型吗?

我对仅限于 Lua 5.1 C API 的答案最感兴趣,因为我正在使用目前适用于此版本的 LuaJIT。

澄清

这些函数的优点luaL_checkXXX是,在一行中,它们:

  • 如果类型错误,则抛出信息丰富、用户友好的错误消息,并且
  • 提供可立即使用的 C 友好返回值。

我正在为桌子寻找类似的东西。我不期望 C 友好的哈希表返回值,但如果有问题的参数不可索引,我确实希望向用户提供相同质量的错误消息。

我接受鸭子打字的哲学。如果我编写的函数只是想从参数中索引一些键,那么我不在乎该参数是否真的是一个表,或者只是一个支持__index查找的用户数据。我想接受任何一个。

0 投票
2 回答
2642 浏览

string - lua_isstring() 检查 Lua 中的真实字符串

如果给定可接受索引处的值是字符串或数字(始终可转换为字符串),则此函数返回 1,否则返回 0。(来源

是否有一种(更优雅的)方法来真正证明给定的字符串是否真的是字符串而不是Lua 中的数字?这个功能对我来说完全没有意义!

我的第一个想法是另外检查字符串长度

……但这感觉不太好。

0 投票
1 回答
1695 浏览

c - 从 Lua 调用 C 库函数

我正在尝试在 Lua 中加载以下 C 库:

我正在编译这个文件:

在解释器中运行时,我看到以下内容:

我没想到m会在nil这里。这本书提到了使用lua_pushcfunction()但仅当它是一种“快速而肮脏的方式”[1] 从解释器运行函数时。使用此 C 文件中的方法的其他示例不使用lua_pushcfunction(),因为它们暗示luaL_Reg结构是 Lua 知道可以调用什么的方式[2]。


[1] Lua 第 3 版中的编程,第 274 页

[2] Lua 第 3 版中的编程,第 279 页

0 投票
0 回答
359 浏览

c - 关闭 lua 状态时关闭共享库

我正在使用来自 lua 的自定义共享库。要加载这个库,我需要 Lua 函数luaopen_mylib。然而,这个库在卸载时需要释放资源和其他东西;所以我想知道,Lua 在关闭共享库(luaclose_*或类似库)时是否调用了某些函数。

如果没有,关于如何做到这一点的任何建议?请注意,在我调用之前,lua 代码实际上并不知道它正在被关闭lua_close(luaState),只有主机程序知道它。

如果需要特殊处理,共享库是多线程的。

0 投票
2 回答
1166 浏览

c - 如何将 Lua 中的值列表返回到 C 并一一打印?

我正在使用嵌入 Lua 的 C API。我的目标是:将整数数组传递给 Lua 并计算它们的阶乘,然后将结果传回 C 并打印出来。

为了实现这个目标,我的 C 代码是:

我的 Lua 脚本是这样的:

编译进行得很顺利,但是当我在终端上运行它时,我得到了:

我不知道为什么结果是这样的。从 C 到 Lua 的传递似乎没有问题,但从 Lua 到 C 的传递有问题。谁能帮我解决这个问题?