问题标签 [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.
lua - Lua中混合类型的等式运算符
与算术元方法不同,关系元方法不支持混合类型。
同时
仅当被比较的两个对象共享此元方法时,Lua 才调用相等元方法
所以我正在用 C 实现我的库,并希望能够支持类似的行为
通过提供
和
哪个似乎不起作用,有解决方法吗?
注意: my_equal 能够在它的任何参数中处理 A 类型和 B 类型的用户数据
更新:元表注册:
申请代码:
c++ - Lua C++ 用户数据矩阵访问元素
我在 C++ 中有一个矩阵类,构造函数如下:
我已经实现了 set 和 get 方法,如下所示:
矩阵类可以从 Lua 访问;但是,我可以从 Lua 访问矩阵元素的唯一方法是,如果 m 是矩阵,m:GetValue 或 m:SetValue。
我想知道是否可以通过符号 m[1,2] 或 m(1,2) 访问(设置)矩阵元素,其中 m 是矩阵,[1,2] 是第一行的元素,并且第二列。
c - 如何在 C 语言的 Lua 模块中创建 Lua 模块?
我有一个Actor
我想给一个Script
.
我不想拥有多个共享对象,而是希望拥有一个包含其自身依赖项的顶级模块。
换句话说,我希望能够做到这一点:
这两个都简单地返回创建和类型userdata
的函数。我的问题是,虽然我可以加载此代码,但它不能按预期工作。似乎只是以某种方式返回了一个。Actor
Actor.Script
Script
Actor
userdata
我期待:
如果我将代码“分解”到两个不同的模块中,我会得到预期的结果,但我真的很想把它放在一个模块中。
我在 OSX 和 Clang 上编译:
这是我正在使用的代码:
演员.c:
脚本.c:
常见的.h:
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
例如设置新的堆栈框架,还是根本不应该这样做?
c - 在 Lua 注册表中存储 C 结构
当我将 Lua 集成到我的 C 程序中时,我一直在使用static
指向 C 结构的指针来存储我需要在绑定到 Lua 状态的方法中重用的对象。
但是,一旦我将 Lua 库从主程序中拆分出来,这将不起作用,因此我似乎需要使用注册表来存储我的结构。
如何将我的 C 结构指针存储在 Lua 注册表中?
这就是我目前正在做的事情:
编辑:从我在 IRC 上得到的答案看来,我应该使用metatable,所以我目前正在研究这个。
c - 在 C 中编写面向 Lua 的函数时,检查参数是否支持类似表的查找的好方法是什么?
这是一个可以检查参数是否为表的潜在模式:
每当第一个参数是表格时,这都有效。但是,其他 Lua 类型支持表查找,例如 userdata,在 luajit 中支持 cdata。
lua_getfield
有没有一种很好的方法可以在我调用它之前检查表查找(例如 via )是否会成功?我的意思是不将类型限制为表格。相关地,表、userdata 和 cdata 是 luajit 中唯一支持索引查找的类型吗?
我对仅限于 Lua 5.1 C API 的答案最感兴趣,因为我正在使用目前适用于此版本的 LuaJIT。
澄清
这些函数的优点luaL_checkXXX
是,在一行中,它们:
- 如果类型错误,则抛出信息丰富、用户友好的错误消息,并且
- 提供可立即使用的 C 友好返回值。
我正在为桌子寻找类似的东西。我不期望 C 友好的哈希表返回值,但如果有问题的参数不可索引,我确实希望向用户提供相同质量的错误消息。
我接受鸭子打字的哲学。如果我编写的函数只是想从参数中索引一些键,那么我不在乎该参数是否真的是一个表,或者只是一个支持__index
查找的用户数据。我想接受任何一个。
string - lua_isstring() 检查 Lua 中的真实字符串
如果给定可接受索引处的值是字符串或数字(始终可转换为字符串),则此函数返回 1,否则返回 0。(来源)
是否有一种(更优雅的)方法来真正证明给定的字符串是否真的是字符串而不是Lua 中的数字?这个功能对我来说完全没有意义!
我的第一个想法是另外检查字符串长度
……但这感觉不太好。
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 页
c - 关闭 lua 状态时关闭共享库
我正在使用来自 lua 的自定义共享库。要加载这个库,我需要 Lua 函数luaopen_mylib
。然而,这个库在卸载时需要释放资源和其他东西;所以我想知道,Lua 在关闭共享库(luaclose_*
或类似库)时是否调用了某些函数。
如果没有,关于如何做到这一点的任何建议?请注意,在我调用之前,lua 代码实际上并不知道它正在被关闭lua_close(luaState)
,只有主机程序知道它。
如果需要特殊处理,共享库是多线程的。
c - 如何将 Lua 中的值列表返回到 C 并一一打印?
我正在使用嵌入 Lua 的 C API。我的目标是:将整数数组传递给 Lua 并计算它们的阶乘,然后将结果传回 C 并打印出来。
为了实现这个目标,我的 C 代码是:
我的 Lua 脚本是这样的:
编译进行得很顺利,但是当我在终端上运行它时,我得到了:
我不知道为什么结果是这样的。从 C 到 Lua 的传递似乎没有问题,但从 Lua 到 C 的传递有问题。谁能帮我解决这个问题?