我在lua中有一个接受userdata对象的函数。
function Class:AttachToUserdataObject(userdataObject)
userDataObject.tableAttached = self
end
但是稍后,当我使用相同的userdata对象时,我找不到它 - userdataObject.tableAttached
为零。我觉得我还没有完全理解userdata对象的工作方式。
有没有办法将对象绑定到userdata,除了创建一个全局表,其中包含所有userdata对象的id(它们具有唯一的id)和对表的引用?
我想保持它尽可能优雅,但如果没有C ++代码,我想我可以牺牲一些优点,如果它只是有效。
答案 0 :(得分:3)
userdata对象没有像表这样的字段,Lua对底层C对象的内部结构一无所知。为了实现您的目标,您必须处理__index
和__newindex
元方法。
因此,例如,在执行userdataObject.tableAttached = self
之类的分配时,会触发__newindex
元方法。在其中,您可以将值存储在元表本身(受可能的名称冲突)或另一个表中,该表本身存储在元表中。
要恢复数据,您必须处理__index
元方法。用户数据可能会有点棘手,所以如果你遇到问题,请告诉我。
答案 1 :(得分:2)
您可以使用支持弱表:
local _data = setmetatable({}, {__mode='k'})
function Class:AttachToUserdataObject(userdataObject)
_data[userDataObject] = self
end