如何将表的引用添加到userdata对象?

时间:2013-05-28 19:56:58

标签: reference lua lua-userdata

我在lua中有一个接受userdata对象的函数。

function Class:AttachToUserdataObject(userdataObject)
  userDataObject.tableAttached = self
end

但是稍后,当我使用相同的userdata对象时,我找不到它 - userdataObject.tableAttached为零。我觉得我还没有完全理解userdata对象的工作方式。

有没有办法将对象绑定到userdata,除了创建一个全局表,其中包含所有userdata对象的id(它们具有唯一的id)和对表的引用?

我想保持它尽可能优雅,但如果没有C ++代码,我想我可以牺牲一些优点,如果它只是有效。

2 个答案:

答案 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