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

c++ - 如何使用 delete 运算符释放 lua_newuserdata 分配的内存?

如何释放分配的内存lua_newuserdata

我有一个类叫做Foo,这个类有构造函数和析构函数,我都需要执行,但是我不知道如何使用 C++ 运算符delete,因为我没有使用new分配内存。

我尝试在创建对象的 Lua 函数 new 中这样做:

在 gc 函数中,我尝试了:

但是我遇到了分段错误。

0 投票
2 回答
298 浏览

lua - 在 Lua 元表中同时指定“方法”和索引运算符

我需要 userdata 对象来支持方法和索引运算符(带有整数索引)。有没有办法在一个常见的元表中实现这一点,而无需通过函数模拟方法?

我尝试通过将metatable(object).__index实际方法设置为表以及metatable(metatable(object).__index).__index实现索引运算符的函数来链接元表。但是,该函数是使用第一个__index表作为参数调用的,而不是原始对象。__index这似乎是一个设计疏忽,因为当元方法是一个函数时传递原始对象更有意义。无论如何,有没有办法在不显式检查函数中的方法名称的情况下实现我想要的__index

0 投票
2 回答
4470 浏览

lua - 从纯 Lua 创建新的空用户数据

我想我在 Lua 中的某个地方看到了一个可以返回新用户数据的本机函数。它存在吗?是否可以从普通 Lua 脚本创建自定义用户数据?

0 投票
1 回答
1113 浏览

c++ - Lua API 推送用户数据

我正在尝试为我的组件系统提供脚本功能。当然,每个组件都有一个字段“parent”,它拥有对父 Actor 的访问权限。我可以编写代码,这样我就可以从 Lua 访问我的 C++ 方法,但是当我想返回自定义用户数据时遇到了困难,比如 actor。我有一个 getParent() 方法,我想返回 Actor 用户数据,所以我可以这样编写 Lua 代码:

我怎样才能做到这一点?使用轻用户数据?或者当 getParent 被调用时,创建一个新的用户数据,并将该指针指向原始用户数据?

0 投票
1 回答
136 浏览

c++ - 在 Lua 脚本中使用 C++ 对象

如何在 lua 脚本中使用 C++ 对象?

示例类:

在 lua 中使用的示例(是我需要的):

谢谢!

0 投票
1 回答
379 浏览

c++ - 创建属性和方法 Lua C++

这很难解释,我在文档或网络上的任何地方都找不到任何内容,所以我认为这将是解决这个问题的合适地方。

我正在尝试使用 C++ 在 Lua 中的对象上注册属性和方法。

这就是我想要在 Lua 中实现的目标:

我可以使用 C++ 轻松实现示例中的第一行

但是我如何创建方法和:jump()属性?.setX.getXcreatePlayer

0 投票
1 回答
6052 浏览

c - Lua 用户数据数组访问和方法

我正在用 C 语言编写用于 Lua 的用户数据类型。它还有一些数组类型的属性和各种方法。现在,如果你属于这种类型,我会使用u:set(k,v)resp。u:get(k)访问数据,例如u:sort()作为方法。为此,我设置__index了一个包含这些方法的表。现在,如果我想使用u[k] = vor访问数据u[k],我需要设置__newindex和resp 。但随后其他方法不再可用......__indexsetget

在 C 中处理这个问题的最佳方法是什么?我猜我需要用 C 编写一个函数来注册__index并在那里处理它。也许检查 key 是否属于 Lua 方法表,如果是则调用它。

任何帮助/提示将不胜感激。我没有找到这样的例子,尽管(对我来说)这似乎是一件很自然的事情。

编辑: 在 Lua 中添加了我的 C 版本解决方案,发布在下面的答案中。这或多或少是直接翻译,所以所有功劳都归于@gilles-gregoire。

以下 C 函数注册为 __index 元方法。

这是执行此操作的代码,

permL_methods在哪里

并且permL_functions

0 投票
2 回答
2520 浏览

c++ - ./lua/addtest.lua:9: 尝试索引本地“testobj”(用户数据值)]]

test.exe调用addTest.lua并设置lua_testobj到表中,addTest.lua调用testobj.dll,但是testobj.dll不能得到“lua_testobj”

错误消息是

addTest.lua:9 尝试索引本地“testobj”(用户数据值)

  1. 测试程序

    /li>
  2. addtest.lua 代码如下

    /li>
  3. testobj.dll 源代码如下

    /li>
0 投票
1 回答
235 浏览

c - 使用lua的lightuserdata注册定时器回调

我想包装 C 计时器(不是警报)并在 lua 中使用它,我可以指定一个回调函数在一秒钟后触发。为了使用多个定时器,定时器ID和回调将被存储到一个表中,但是当'lua_rawset'被调用时发生了Segmentation fault,所以我使用stack_dump检查lua堆栈,'lua_rawget'返回nil在线66(lr_register_timer,由FIXME标记),这里有什么问题?对不起,我的英语很差。干杯。

lua代码:

C代码:

0 投票
1 回答
406 浏览

c - Lua调用C/C++时如何找出用户数据的类型

我正在使用 Lua 调用 dll 文件。我的 c/c++ 代码是这样的:

我使用 VS2010 编译了这个 C/C++ 代码。我的 Lua 代码是这样的:

如您所见,在Lua中,参数a和b都是userdata类型,但在C/C++中,a的类型是StructA,b的类型是StrcutB,所以当Lua调用C/C++函数并传递a或b时,C如何/C++ 代码找出参数的类型?请通过将“某些条件”替换为可以完成工作的东西来完成此代码。