问题标签 [lua-userdata]
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.
binding - Lua 绑定:表与用户数据
在为 C++ 类进行 Lua 绑定时,我应该返回表还是用户数据对象?
有谁知道每种方法的优缺点?
c - 保存对 Lua 的用户数据的引用
#1 卢阿:
#2 C:
#3 卢阿:
#4 C:
编辑:
将尝试用伪代码更简单地解释:
卢阿:
C:
Lua:制作新方法
在 C 中,某些事件(比如说计时器)触发 C 方法
所以问题是:如何在 C 中存储指向某个 Lua 对象的指针(希望我需要那个),通过该指针获取 Lua 对象并在其中调用方法
lua - Lua userdata gc
Is it possible for a piece of Lua userdata to hold reference to a Lua object? (Like a table, or another piece of userdata?). Basically, what I want to know is:
Can I create a piece of userdata in such a way taht when the gc runs, the user data can say: "Hey! I'm holding references to these other objects, mark them as well."
EDIT: responding to lhf:
Suppose I have:
Now, I can do:
but suppose instead I want:
[i.e. suppose Vertex & Quaternion are really big pieces of userdata].
Now, suppose I have a Lua user function that takes a userdata Vertex, and a userdata Quaternion, and creates a userdata Bar (I don't want a userdata Foo since I want to save the space) -- then I need somehow for the userdata Vertex*/Quaternion* to not be gc-ed.
c - 在 Lua 中将 userdata 设置为命名空间
我研究了这个主题并尝试了各种方法,但我无法实现我的想法(我什至不确定这是否可能)。基本上,我有几个用 C 创建的 userdata 对象,可以通过它们的元表访问,如下所示:
主程序.lua
config.display_width = 1280
我想做的是将配置命名空间“强制”到特定的脚本。您已经猜到了,我需要保护一个配置文件,以便限制用户只能处理配置元表。像这样:
配置文件
display_width = 1280
而且我知道我必须在 C 中做这样的事情:
提前谢谢你,这个让我发疯!
PS:作为记录,我真的需要保留配置用户数据,因为它绑定到 C 结构。因此,我不担心在不同环境之间“丢失” Lua 状态或声明的变量。
添加以下信息。这是创建配置用户数据的方式:
因此,每次用户从配置用户数据中设置或获取值时,我都会通过__index
or__newindex
方法更新 C 结构。
types - Lua 中高效的自定义数据类型
我需要一个在 Lua 中使用的二维矢量数据结构。到目前为止,我已经找到了几个解决这个问题的方法:
- 在纯 Lua 中定义数据类型的经典解决方案——缺点是对它的所有操作(如加法)都需要创建新的数据类型、设置元表等。x、y 存储为字段,因此访问速度很快。
- C端的经典完整用户数据解决方案——它可能更快,仍然允许操作员,操作代码是C端的,但仍然每个操作都需要分配一个新对象。虽然没有字段的可能性,所以需要做一个自定义的 __index/newindex 函数来模拟 x 和 y 在 Lua 方面可能很慢。
- 混合方法,我们定义一个 Lua 对象但通过 C 代码,x 和 y 仍然是具有简单访问的字段,但函数将用 C 编码,因此更快?
我确实尝试了#1 方法,但由于效率问题,我计划改用#2 或#3,但是我不知道哪个更有效。
另一方面,也有可能在编译器本身中对数据类型进行硬编码,但我认为我还没有准备好接受如此激进的想法:)(这并不像听起来那么疯狂,二维向量会很好适合原生 Lua 类型的两倍大小)。
这两种方法哪一种更有效?在这些情况下,有没有我没有想到的陷阱?
c++ - 在 Lua 中访问 Light 用户数据
我可能误解了它们的使用或误读了文档,但是如何访问作为轻用户数据传递给 Lua 的结构或类的成员?例如,如果一个向量使用以下结构
被声明为“测试”并定义为 x = 413 和 y = 612,并通过调用推送
操作或打印 x 和 y 的函数的 Lua 代码会是什么样子?
java - 向用户数据添加方法
我正在尝试向这样的现有用户数据添加一个方法,但是这让我犯了一个错误。
我在一个网站上找到了这个例子,但它也不起作用
有没有一种工作方法可以将方法/函数添加到 Lua 中的现有用户数据
c++ - 如何设置一个元表以从另一个元表继承,同时将用户数据更改为另一种类型?
这是我想在 C++ 中使用 Lua C API 做的事情。
我试图找出一种使 userdata 从基本 userdata 对象派生的好方法。
我希望能够做到这一点:
代替:
在这些示例中,me:GetCurrentItem() 返回带有一些函数的 userdata,但它缺少 item:GetBaseObject() 返回的基本函数。
我在 Crysis Wars SDK 中绑定 Lua 用于学习目的。SDK 为作为结构的基本实体提供了一个接口。IItem 结构 (me:GetCurrentItem()) 是相同的。由于这些是结构,我不能将它们转换为基本结构或调用它的基本函数。我必须使用 IEntity *GetEntity() 函数。
我尝试在 __index 中更改 self 指针,但它会导致局部变量“item”变为“entity”,这有点明显,但我希望它在调用 GetPos 函数后恢复,这在某种程度上似乎不合逻辑。
有没有人有一个很好的解决这个问题?
string - Lua 中的 Wireshark 解析器 - userdata
我是 Lua 的新手,我正在为 Wireshark 构建一个自定义解析器。我的情况是这样的:
Wireshark 数据由十六进制数字组成,例如 4321 8765 CBA9。我想结束的是(在解剖之后):CBA9 8765 4321。
到目前为止,我所做的是在 Lua 中创建一个小函数,它将单独获取这些数字,将它们转换为字符串,并将它们按正确的顺序放置。
但是,一旦我将这束添加到树中,我会收到一条错误消息 Lua Error: ...: call 'add' on bad self (userdata expected, got string)。
我怎样才能解决这个问题?我需要完全不同的方法吗?我不是在寻找任何复杂或花哨的东西。我需要做的就是我所描述的。任何帮助,将不胜感激。
delphi - 如何从 Delphi 正确注册 Lua 用户数据?
我仍然对将 Delphi 用户数据注册到 Lua 感到困惑。为了教我原理,我尝试实现 Date(Time) 类型。
一开始这种类型应该有三个 Lua 可以访问的函数:
new
创建此类型变量的函数。- 一个
getdate
函数。 - 和一个
setdate
功能。
最后这个小 Lua 脚本应该可以工作:
我试图自己实现它(使用Lua 中的编程一书),但我收到一条错误消息:_attempt to index global 'DT' (a userdata value)_
在第 2 行。我可能在用户数据注册方面做错了,但我无法找到错误。
我希望你能帮我找到它,这是我已经得到的:
因为我不确定 luaL_register 函数(它只能通过创建一个必须用 调用的库来工作require
吗?)我还尝试RegisterDateTime
用这个替换该函数:
不幸的是,两个版本的 RegisterDateTime 的效果 (errormessage ;)) 是相同的。在脚本启动之前,它们在我的 Delphi 程序中直接调用(我通过在“RegisterDateTime”和“newdatetime”中设置断点来确保这一点。这两个函数都按此顺序调用。所以我的错误必须在这两个函数之一中。我'我几乎可以肯定这是一件简单的事情,但我看不到它。:(