- 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 *
指针存储在用户数据中,并提供实现熟悉的 read
、write
和类似方法的绑定(bind)。通过实现 __gc
元方法,io
库可确保其 file
对象之一关闭关联的 FILE *
当它被收集时。
轻量级用户数据是在 Lua 中将指向某物的指针表示为值的方式。您可以通过调用 lua_pushlightuserdata()
创建一个与指针即为它的值。它们由 Lua 管理,就像数字一样。当您需要以名称可以在 Lua 内传递的方式命名 C 对象,但该对象的生命周期不由 Lua 管理时,它们非常有用。当数字具有相同的值时,它们就相等;当它们拥有相同的指针时,轻用户数据就比较相等。与数字一样,只要它们位于堆栈上或存储在变量中,它们就存在,并且它们没有单独的元表,并且不会被垃圾回收。
关于lua - Lua中的userdata和lightuserdata是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329643/