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

c++ - 在 C++ 中删除我所有的 Lua 用户数据

我想知道是否可以访问所有用户数据“表”(它是否称为用户数据表?)然后从 Lua 中删除它们,因为这是我的问题:

正如您首先看到的,我创建了一个对象并保存了一个指向名为 Object 的 c++ 类的指针,该类在我的地图类中使用“new”分配。然后我删除对象,这意味着我删除了为地图类中的指针分配的内存。最后我调用 SetPosition,如果内存仍然分配给 c++ Object 类,那么一切都会很有趣。但是如果它被删除(在这种情况下是因为我们在 SetPosition(...) 调用之前调用了 Delete())我的程序将崩溃。所以我想知道的是:

是否可以通过调用 Delete 将 lua 中的变量 'a' 设置为 nil ?我知道如果 Delete 返回 nil,我可以执行类似 'a = a:Delete()' 的操作,但如果我忘记执行 'a =' 部分,它会失败。另外我想知道是否可以删除用户数据并在我调用 SetPositon() 时检查它是否不存在,如果不存在,我将返回。

此外,基本代码来自: http: //lua-users.org/wiki/SimpleCppBinding

0 投票
3 回答
316 浏览

lua - Lua 是否允许带有奇怪数量的参数的元方法?

例如,我可以声明一个带有__index两个参数的元方法,然后执行类似的操作myuserdata[somearg1, somearg2]吗?并不是说我想使用它,或者我知道它为什么有用,我只是想知道在我处理将 c++ 绑定到 Lua 的库中我是否可以并且应该强制执行一项权利(__call当然元方法除外)绑定为元方法的函数的参数数量。

0 投票
2 回答
917 浏览

c++ - Lua RPC 和用户数据

我目前在我的程序中使用 luarpc 进行进程间通信。现在的问题是,由于我的 tolua++ 绑定将类实例存储为用户数据,我无法使用这些函数中的任何一个,导致 luarpc 无法处理用户数据。我现在的问题是,如果您知道用户数据始终只有一个指针(4 个字节)并且附加了一个用于调用和索引操作的元表,是否可以(以及如何)传输用户数据。

0 投票
2 回答
5234 浏览

c++ - Lua用户数据对象管理

我正在尝试将 Lua 类对象推入堆栈。指向该对象的指针可以由多个函数返回。

换句话说:我需要推送用户数据值,同时仍然能够在它们上使用“==”、“~=”等,因此如果用户数据指针是相同的 C++ 对象,则它必须相同。

firstObject 将由 lua 脚本存储,稍后在代码中我将需要再次执行此操作:

我的 Push 函数基本上应该检查某处是否已经存在相同的 C++ 类指针,如果是,则推送相关的 userdata 指针(无论我如何推送它,对象应该以 1:1 的方式工作)

如果不是,它应该创建一个新的用户数据(将其推入堆栈)并将其内容设置为类对象。

这是我的代码:

LuaToUData 是一个自己的函数,我写它不会引发 lua 错误:

0 投票
1 回答
1867 浏览

lua - Hand over global custom data to Lua-implemented functions

Within my Lua-application I have some own functions defined that are registered with lua_register("lua_fct_name","my_fct_name") so that they are known to the Lua script.

Now I have some custom/user data that need to be accessible within my_fct_name(). It is just a pointer to a memory area I manage for my own so I use lua_pushlightuserdata (L,data) to add it to Lua-context.

Now it seems I don't have the correct position to add these data. When done right after L was created I can't access the data in my_fct_name(), here lua_touserdata(L,1) does return NULL, so it is not available on the stack. When done right before lua_pcall() executes the script, I get an error message about unexpected data.

So where/when do I have to set my user data so that they are available within my_fct_name()?

0 投票
2 回答
1324 浏览

reference - 如何将表的引用添加到 userdata 对象?

我在 lua 中有一个接受 userdata 对象的函数。

但后来,当我使用相同的 userdata 对象时,我找不到它 -userdataObject.tableAttached为零。我觉得我还没有完全理解 userdata 对象的工作方式。

除了创建一个具有所有用户数据对象的 id(它们具有唯一的 id)和对表的引用的全局表之外,还有什么方法可以将对象绑定到用户数据?

我想尽可能地保持它的优雅,但是如果不能访问 C++ 代码,我想我可以牺牲一些优雅,如果它正常工作的话。

0 投票
1 回答
535 浏览

c - 从 C api 访问 userdata 中的 Lua 变量

我正在开发一个使用 Lua 作为脚本语言的 C++ 编写的项目。为了方便调试,我们实现了一个网络调试器,它接收 Lua 代码,运行它,在 Json 中编码返回值并将该字符串发回。

我设法为表实现了这一点,但现在我被存储在用户数据中的变量困住了。例如,我有这个 Lua 代码:

Application,Avatar并且Physics是在 C++ 中创建的对象。然而,这两个testVars是在上面的脚本中创建的。 Elements是一个表格,所以我可以列出所有元素,但Avatar.testVar似乎是隐藏的,因为AvatarLUA_TUSERDATA.

有谁知道如何检测已添加到 Lua 中的用户数据的变量?

0 投票
1 回答
2411 浏览

c# - 在 Lua 中访问 userdata 属性和方法

我有一个关于在 LuaInterface 中访问用户数据类型的问题。当我将 C# 字典传递给 Lua 并尝试使用 ipairs 对其进行迭代时,我收到一个错误,因为 ipairs 需要一个表而不是 userdata 对象。

我想一种解决方案是在将 Dictionary 类型传递给 Lua 之前将其转换为 LuaTable 类型,但我想将 userdata 类型用于其中的一种用途是将 Dictionary 对象引入 Lua 并更新 customType 对象的字段和在 Lua 中调用他们的方法。我不知道这是否可能,但我很确定如果我将该 Dictionary 转换为字符串和整数的 LuaTable,我将失去任何直接与 Lua 中的 customType 交互的机会。

我在网上查找了有关在 Lua 中使用 userdata 的信息,但是我发现了几个通过 C/C++ 与 Lua 接口的示例以及我不太了解的堆栈。此外,在某些情况下使用 sizeof 方法,这在 c# 中没有简单的替代方法。有人可以给我一些指示吗?关于 C 中用户定义类型的 PIL 部分也没有太大帮助。

0 投票
0 回答
713 浏览

hash - Lua 轻量级用户数据

我对 Lua 有疑问,我不知道我是否朝着正确的方向前进。在 C++ 中,我有一个字典,用于将参数传递给资源管理器。这个字典非常类似于哈希和字符串的映射。

在 Lua 中,我想访问这些资源,所以我需要哈希的表示。哈希也必须是唯一的,因为它被用作表中的索引。我们的哈希函数是 64 位的,我正在研究 32 位环境(PS3)。

C++ 我有类似的东西:

在 Lua 中想要使用这些资源为其他用户数据创建工厂。我做这样的事情:

因此,有时参数由 Lua 创建,有时参数由 C++ 创建。因为 myhashkey ('vehicleId')是一个表的索引,它必须是唯一的。我已经使用 lightuserdata 来实现 uint64_t,但由于我处于 32 位环境中,我不能简单地存储int64在指针中。:(

我必须创建一个表来存储int64程序使用的所有内容并将引用保存在 userdata 中。

但用户数据永远不会被垃圾收集。然后我的 int64 永远不会被释放,我的表将永远增长。lightuserdata 也不会保留对元数据的引用,因此它们会干扰其他轻量用户数据。检查实现,元数据表被添加到 L->G_->mt_[2]。这样做

将使用 的元表b

我认为那个元表是有界的。我很困惑,目前的实现 lightuserdata 有一个非常有限的用例。

使用 Python,您有一个散列元函数,该类型在用作字典索引的任何时候都会被调用。有可能做类似的事情吗?

对不起我的英语,我来自意大利。:-/

0 投票
3 回答
1060 浏览

c++ - 如何在 Lua 代码中扩展 SWIG 的用户数据?

我正在使用 SWIG 将 C++ 代码绑定到 Lua。到目前为止看起来不错,但现在我需要“作弊”并从 Lua 中扩展单个用户数据,添加自定义字段和方法等。

在 SWIG 的指令中工作时,我找不到完成它的方法。我知道魔术发生在包装器代码的哪个位置,但我不完全理解 __index 和 __newindex 是如何工作的。此外,SWIG 使用 __setitem 和 __getitem,它们被注释为“/* NEW:查找 __setitem() fn 这是用户提供的 set fn */”——也不知道这意味着什么。最后,我的环境会在每次构建之前自动调用脚本将 SWIG 指令绑定到 C++ 包装器,因此如果我选择重新编译或添加更多 Lua 绑定,那么之后修改源代码会非常乏味。

到目前为止,我唯一的结论是使用 toLua++,它记录了这个特性。请帮我避免大量的过渡工作!

编辑:我还发现 5.2 中的“lua_setuservalue”API 调用 - 它似乎很有用,但我不明白在所有 SWIG 绑定代码中我会在哪里调用它。

编辑:清理事情:

我通过 C 函数创建对象

通过在 *.i swig 定义中包含它的原型,此函数受 SWIG 的约束。

在 Lua 中,我编写如下代码:

编辑:进步!我按照 Schollii 的说明编写了以下 Lua 代码。这里,“ground”是之前使用绑定 C++ 代码获取的用户数据。代码存储了 swig 的 __index 和 __newindex 版本,然后我重新创建了这些函数,这些函数首先查询另一个(“_other”)表。

我目前的问题是存储在“_other”表中的新值在该类型的所有用户数据对象之间共享。换句话说,如果 ground.nameFoo = "ha!",所有其他对象都有 nameFoo 字段存储 "ha!"。我该如何解决?

编辑:我从这个答案中实现了解决方案:Add members dynamic to a class using Lua + SWIG

问题是现在我的对象类型不再是 userdata,它是一个表。这意味着我不能再有机地将它作为参数传递给其他以 userdata 作为参数的绑定 C++ 函数。有什么解决办法吗?而且我必须对每个返回 userdata 对象的函数执行此操作。