【问题标题】:How to add a reference to table to userdata object?如何将表的引用添加到 userdata 对象?
【发布时间】:2013-11-22 23:49:58
【问题描述】:

我在 lua 中有一个接受用户数据对象的函数。

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

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

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

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

【问题讨论】:

标签: reference lua lua-userdata


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您描述整个过程,而不是仅仅放弃代码示例。我决定暂时使用一张桌子,因为我正在尝试做的事情似乎会破坏 Lua 约定。
【解决方案2】:

您可以改用支持弱表:

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

function Class:AttachToUserdataObject(userdataObject)
    _data[userDataObject] = self
end

【讨论】:

  • 我真的希望你在这里给出一个更完整的例子,我有一个使用 userdata 的系统,但现在我认为我最好使用一个由 userdata 元表支持的真实表。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2014-09-14
  • 2023-01-19
  • 2023-03-31
  • 2013-09-30
  • 2019-09-13
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多