2

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

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

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

除了创建一个具有所有用户数据对象的 id(它们具有唯一的 id)和对表的引用的全局表之外,还有什么方法可以将对象绑定到用户数据?

我想尽可能地保持它的优雅,但是如果不能访问 C++ 代码,我想我可以牺牲一些优雅,如果它正常工作的话。

4

2 回答 2

4

用户数据对象没有像表这样的字段,而且 Lua 对底层 C 对象的内部结构一无所知。为了实现你想要的,你必须处理__index__newindex元方法。

因此,例如,在进行类似的赋值时userdataObject.tableAttached = self__newindex会触发元方法。在其中,您可以将值存储在元表本身(可能会发生名称冲突)或另一个表中,该表本身存储在元表中。

要取回数据,您必须处理元__index方法。使用 userdata 可能会有点棘手,所以如果您遇到问题,请告诉我。

于 2013-05-29T07:16:26.473 回答
2

您可以改用支持弱表:

local _data = setmetatable({}, {__mode='k'})

function Class:AttachToUserdataObject(userdataObject)
    _data[userDataObject] = self
end
于 2013-05-28T23:54:20.643 回答