【问题标题】:Lua add a instance field to userdata with C++Lua使用C ++向用户数据添加实例字段
【发布时间】:2020-03-02 16:53:05
【问题描述】:

我想向来自 C++ 的 Lua 用户数据对象添加一些静态字段。有问题的对象是向量,它们是在 C++ 领域创建的,它们可以按原样工作,但我已经在我的用户数据上尝试了 lua_setfield,但我得到了 attempt to index a Vector value 错误,我真的不想使用.x(), .y(), .z() 由于必须调用函数、压入堆栈然后在 Lua 端读取的成本。

有没有办法在用户数据上注册字段以供 Lua 访问?

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    用户数据没有“字段”。它可以拥有一个元表,您可以为它定义__index 和__newindex 元方法。给定这样一个元表,前一个函数在读取用户数据字段的值时调用,而后者在从外部(ud.some_field = 4 或等效项)为字段赋值时调用。如果您希望字段是只读的(在某种程度上),您可以只实现__index,而用户尝试使用__newindex 将失败。

    因此,在您的 C++ 代码中,创建用户数据后,您可以使用 lua_setmetatable 为其分配一个表,其中定义了这些方法。当然,这些函数需要从 userdata 访问实际的 C++ 对象并获取您感兴趣的特定值。

    【讨论】:

    • 真可惜,这与为组件定义元方法一样昂贵,只是源代码中的内容不太清楚。感谢您的回答。有可能做相反的事情吗?如果我将带有值的表推送到堆栈中,我可以将 userdata 分配为它具有的方法(例如长度和点)的亚稳态吗?
    • @DaveMackintosh:“这与为组件定义元方法一样昂贵”一点也不贵。这是大多数 Lua 接口的工作方式。 “用值将表推入堆栈” 一个表有什么值?为什么表需要元方法?
    • 我的意思是保存向量的分量,所以一个带有.x, .y, .z, .w 和Vector 用户数据的元方法的表,这样我就可以调用myVector:Length() 和myVector * myOtherVector 等。跨度>
    • @DaveMackintosh:我不明白为什么你需要一个元表来使myVector:Length() 工作。如果myVector 是一个 Lua 表,那么它可以有一个键“Length”,它具有计算长度的功能,就像你在 Lua 中所做的那样。元表的唯一原因是允许向量数学。但此时,您的代码完全存在于 Lua 中,因此您将不再处理“来自 C++”、“在 C++ 领域创建”的对象。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多