Lua中的userdata和lightuserdata是什么?

Lar*_*ars 25 lua

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

我一直试图绕过它一段时间,但我似乎找不到任何我真正理解的教程/解释.

你为什么需要它们,为什么不能直接将C函数绑定到Lua metatables?

RBe*_*eig 50

userdata是任意大小和内容的垃圾收集值.您可以使用C API创建一个lua_newuserdata(),它会在堆栈上创建并推送它,并为您提供指向其内容的指针,以便根据您的需要从C进行初始化.

它与呼叫非常相似malloc().一个关键的区别malloc()是你永远不需要调用free(),而只是允许最后一次引用它蒸发,垃圾收集器最终将回收它的存储.

它们对于保存从C中有用但必须从Lua管理的数据非常有用.它们支持单个元表,这是允许将C或C++对象绑定到Lua的关键特性.您只需使用C编写的方法填充其元表,该方法可访问,修改和/或使用userdata的内容,结果是可从Lua访问的对象.这方面的一个很好的例子是io,其存储Ç FILE *指针在用户数据,并提供了实施所熟悉的绑定read,write和类似的方法.通过实现__gc元方法,io库可以确保其中一个file对象在FILE *收集时关闭关联的对象.

轻量级用户数据就是如何在Lua中表示指向某事物的指针.您可以lua_pushlightuserdata()使用指针作为其值来创建一个.它们由Lua管理的方式与数字相同.当您需要以可在Lua中传递名称的方式命名C对象时,它们很有用,但对象的生命周期不由Lua管理.类似数字在具有相同值时相等,轻用户数据在保持相同指针时比较相等.与数字一样,只要它们在堆栈中或存储在变量中,它们就存在,并且它们没有单独的元表并且它们不是垃圾收集的.


jpj*_*obs 7

用户数据是来自C端的数据,可以在Lua中使用.例如文件句柄,因为io.input是userdata(尝试print(type(io.input))).如果您开始搞乱Lua C-API(或者使用newproxy函数,它会为您提供一个空的userdatum,您可以在其上设置metatable(参见隐藏的功能http:// lua-users),您将自己需要它. Lua-users wiki上的org/wiki/HiddenFeatures).

一个很好的介绍是:http: //www.lua.org/pil/28.html

至于C函数:你可以只将C函数注册为从Lua中调用的函数,但它不会得到其他数据类型,指向C端数据的指针等.