lua - Lua中的userdata和lightuserdata是什么?

标签 lua

  • Lua 中的 userdata 和 lightuserdata 是什么?
  • 我在哪里需要它?

我已经尝试了一段时间了,但我似乎找不到任何我真正理解的教程/解释。

为什么需要它们,为什么不能直接将 C 函数绑定(bind)到 Lua 元表?

最佳答案

用户数据是任意大小和内容的垃圾收集值。您可以从 C API 创建一个,使用 lua_newuserdata() ,它会创建它并将其压入堆栈,并为您提供一个指向其内容的指针,以根据您认为合适的 C 语言进行初始化。

它与调用 malloc() 非常相似。与 malloc() 的一个关键区别是,您永远不需要调用 free(),而只需允许对它的最后一个引用消失,垃圾收集器就会回收它的最终存储。

它们对于保存从 C 有用但必须从 Lua 管理的数据最有用。它们支持单独的元表,这是允许将 C 或 C++ 对象绑定(bind)到 Lua 的关键功能。您只需使用用 C 编写的方法填充其元表,这些方法可以访问、修改和/或使用用户数据的内容,结果就是一个可以从 Lua 访问的对象。 io library 就是一个很好的例子。 ,它将 C FILE * 指针存储在用户数据中,并提供实现熟悉的 readwrite 和类似方法的绑定(bind)。通过实现 __gc 元方法,io 库可确保其 file 对象之一关闭关联的 FILE *当它被收集时。

轻量级用户数据是在 Lua 中将指向某物的指针表示为值的方式。您可以通过调用 lua_pushlightuserdata() 创建一个与指针即为它的值。它们由 Lua 管理,就像数字一样。当您需要以名称可以在 Lua 内传递的方式命名 C 对象,但该对象的生命周期不由 Lua 管理时,它们非常有用。当数字具有相同的值时,它们就相等;当它们拥有相同的指针时,轻用户数据就比较相等。与数字一样,只要它们位于堆栈上或存储在变量中,它们就存在,并且它们没有单独的元表,并且不会被垃圾回收。

关于lua - Lua中的userdata和lightuserdata是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329643/

相关文章:

lua - 为什么Lua语言中[[1]]的结果等于 '1'?

c# - 在 C++ DLL 中包含 Lua 使其与 C# 不兼容?

lua 模式匹配 : delimited captures

C#外部库(Lua)调用问题

c++ - 发生错误后如何确保(luabind)lua 状态良好?

lua - 在 Lua 中从表中删除元表

string - Pandoc过滤器pandoc.Para Lua函数中的字符转义

linux - Lua允许删除CS2D游戏中的文件

c++ - 如何使用实体/组件/系统架构在更多数据驱动的环境中设置 openGL?

ios - Corona SDK - iOS 游戏中心得分错误,小数逗号