问题标签 [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.

0 投票
1 回答
2112 浏览

binding - Lua 绑定:表与用户数据

在为 C++ 类进行 Lua 绑定时,我应该返回表还是用户数据对象?

有谁知道每种方法的优缺点?

0 投票
2 回答
2678 浏览

c - 保存对 Lua 的用户数据的引用

#1 卢阿:

#2 C:

#3 卢阿:

#4 C:

编辑:

将尝试用伪代码更简单地解释:

卢阿:

C:

Lua:制作新方法

在 C 中,某些事件(比如说计时器)触发 C 方法

所以问题是:如何在 C 中存储指向某个 Lua 对象的指针(希望我需要那个),通过该指针获取 Lua 对象并在其中调用方法

0 投票
2 回答
1202 浏览

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.

0 投票
1 回答
641 浏览

c - 在 Lua 中将 userdata 设置为命名空间

我研究了这个主题并尝试了各种方法,但我无法实现我的想法(我什至不确定这是否可能)。基本上,我有几个用 C 创建的 userdata 对象,可以通过它们的元表访问,如下所示:

主程序.lua

config.display_width = 1280

我想做的是将配置命名空间“强制”到特定的脚本。您已经猜到了,我需要保护一个配置文件,以便限制用户只能处理配置元表。像这样:

配置文件

display_width = 1280

而且我知道我必须在 C 中做这样的事情:

提前谢谢你,这个让我发疯!

PS:作为记录,我真的需要保留配置用户数据,因为它绑定到 C 结构。因此,我不担心在不同环境之间“丢失” Lua 状态或声明的变量。

添加以下信息。这是创建配置用户数据的方式:

因此,每次用户从配置用户数据中设置或获取值时,我都会通过__indexor__newindex方法更新 C 结构。

0 投票
1 回答
1310 浏览

types - Lua 中高效的自定义数据类型

我需要一个在 Lua 中使用的二维矢量数据结构。到目前为止,我已经找到了几个解决这个问题的方法:

  1. 在纯 Lua 中定义数据类型的经典解决方案——缺点是对它的所有操作(如加法)都需要创建新的数据类型、设置元表等。x、y 存储为字段,因此访问速度很快。
  2. C端的经典完整用户数据解决方案——它可能更快,仍然允许操作员,操作代码是C端的,但仍然每个操作都需要分配一个新对象。虽然没有字段的可能性,所以需要做一个自定义的 __index/newindex 函数来模拟 x 和 y 在 Lua 方面可能很慢。
  3. 混合方法,我们定义一个 Lua 对象但通过 C 代码,x 和 y 仍然是具有简单访问的字段,但函数将用 C 编码,因此更快?

我确实尝试了#1 方法,但由于效率问题,我计划改用#2 或#3,但是我不知道哪个更有效。

另一方面,也有可能在编译器本身中对数据类型进行硬编码,但我认为我还没有准备好接受如此激进的想法:)(这并不像听起来那么疯狂,二维向量会很好适合原生 Lua 类型的两倍大小)。

这两种方法哪一种更有效?在这些情况下,有没有我没有想到的陷阱?

0 投票
2 回答
5209 浏览

c++ - 在 Lua 中访问 Light 用户数据

我可能误解了它们的使用或误读了文档,但是如何访问作为轻用户数据传递给 Lua 的结构或类的成员?例如,如果一个向量使用以下结构

被声明为“测试”并定义为 x = 413 和 y = 612,并通过调用推送

操作或打印 x 和 y 的函数的 Lua 代码会是什么样子?

0 投票
1 回答
1027 浏览

java - 向用户数据添加方法

我正在尝试向这样的现有用户数据添加一个方法,但是这让我犯了一个错误。

我在一个网站上找到了这个例子,但它也不起作用

有没有一种工作方法可以将方法/函数添加到 Lua 中的现有用户数据

0 投票
1 回答
387 浏览

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 函数后恢复,这在某种程度上似乎不合逻辑。

有没有人有一个很好的解决这个问题?

0 投票
3 回答
3535 浏览

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)。

我怎样才能解决这个问题?我需要完全不同的方法吗?我不是在寻找任何复杂或花哨的东西。我需要做的就是我所描述的。任何帮助,将不胜感激。

0 投票
1 回答
783 浏览

delphi - 如何从 Delphi 正确注册 Lua 用户数据?

我仍然对将 Delphi 用户数据注册到 Lua 感到困惑。为了教我原理,我尝试实现 Date(Time) 类型。

一开始这种类型应该有三个 Lua 可以访问的函数:

  1. new创建此类型变量的函数。
  2. 一个getdate函数。
  3. 和一个setdate功能。

最后这个小 Lua 脚本应该可以工作:

我试图自己实现它(使用Lua 中的编程一书),但我收到一条错误消息:_attempt to index global 'DT' (a userdata value)_在第 2 行。我可能在用户数据注册方面做错了,但我无法找到错误。

我希望你能帮我找到它,这是我已经得到的:

因为我不确定 luaL_register 函数(它只能通过创建一个必须用 调用的库来工作require吗?)我还尝试RegisterDateTime用这个替换该函数:

不幸的是,两个版本的 RegisterDateTime 的效果 (errormessage ;)) 是相同的。在脚本启动之前,它们在我的 Delphi 程序中直接调用(我通过在“RegisterDateTime”和“newdatetime”中设置断点来确保这一点。这两个函数都按此顺序调用。所以我的错误必须在这两个函数之一中。我'我几乎可以肯定这是一件简单的事情,但我看不到它。:(