我正在使用 lua C api 来运行与本机类接口的脚本。我正在利用 Qt 的 MOC 获取运行时类型信息。到目前为止,我已经实现了我希望 lua 能够与之对话的所有类的创建、删除和索引。
这是我现在可以做的示例脚本:
myObject = MyClass.new() --creates new userdata
otherObject = OtherClass.new() --creates new userdata
myObject:functionForOthers(otherObject) --method that takes userdata as argument
在该脚本中,otherObject
被创建并保留在堆栈中。然后将其传递给functionForOthers()
接受OtherClass
对象作为参数的对象。
但是,如果我不想otherObject
被放入堆栈怎么办?如果我希望它是一个只存在于函数调用范围内的匿名变量怎么办?
myObject = MyClass.new()
myObject:functionForOthers(OtherClass.new())
这仍然有效,但是OtherObject
实例被创建但从未分配给变量,使其在堆栈中无法访问,直到范围结束。这不会导致任何直接的问题,但它会困扰我的内存效率部分。
我有很多本地代码处理这些操作的后端,但它的基本要点是它new
是一个全局表字段,MyClass
它OtherClass
指向一个本地 CreateObject 函数。从那里,在调用后创建类的实例并将其存储在用户数据中lua_newuserdata()
该functionForOthers()
调用使用__index
指向本机 IndexObject 函数的元方法,该方法如果存在则调用该方法。
实现匿名用户数据变量的基本方法是什么?我仍然希望这两个脚本都是有效的方法,我只想要一种将第二个脚本的OtherClass
对象保持在范围内的方法,直到函数调用完成。