c++ - Luabind:在调用表中的函数时如何使用表的存储值?

标签 c++ luabind

我在 Lua 中创建表并将它们存储为 Luabind 对象。然后,我希望调用存储在这些表之一中的函数,所以我会做这样的事情

data["onPrimaryFire"](player, x, y, a);

这个数据里面有一个名为ammo的字段。但是,我无法在 onPrimaryFire 函数中引用此字段。它返回为 nil。我知道我可以通过将 data 作为参数传递给函数来解决这个问题,但这感觉很奇怪而且没有必要。这能做到吗?

最佳答案

是的 - Lua 包含语法糖以使调用成员函数变得简单。

首先,考虑这种编写和调用函数的替代方式:

function data.onPrimaryFire( aPlayer, aX, aY, aA )
    -- do stuff, but cannot access data
end

data.onPrimaryFire( player, x, y, a )

您定义函数,然后调用它。为了做你想做的事,你需要将数据作为参数传入:

function data.onPrimaryFire( aMyData, aPlayer, aX, aY, aA )
    -- do stuff, aMyData.ammo is accessible
end

data.onPrimaryFire( data, player, x, y, a )

正如您所说,这很麻烦,但 Lua 有一个重现此模型的快捷方式 - 使用“:”而不是“.”。

function data:onPrimaryFire( aPlayer, aX, aY, aA )
    -- do stuff, self.ammo is accessible
end

data:onPrimaryFire( player, x, y, a )

所以,这里发生的是,当您调用 data:onPrimaryFire() 时,数据表会作为第一个(不可见的)参数自动传递给该函数。在被调用函数内部,它被称为“self”。

使用这种形式时,注意保持一致!如果你使用“:”来定义函数,但是“.”调用它时,您会将“player”作为“self”传递,并且所有参数都是错误的。但是,如果您了解它是如何工作的,则可以混合和匹配这些表格。例如:

function data.onPrimaryFire( aSelf, aPlayer, aX, aY, aA )
    -- do stuff, aSelf.ammo is accessible
end

data:onPrimaryFire( player, x, y, a )

关于c++ - Luabind:在调用表中的函数时如何使用表的存储值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566195/

相关文章:

c++ - C++ MFC 程序是完全原生的吗?

c++ - 解压可变宏的任何技巧?

c++ - 使用 boost::bind 和 boost::function 时遇到问题

c++ - luabind 什么时候释放创建的对象?

c++ - 在 C++ 中获取指向 Lua 对象实例的指针

c++ - Windows API 中的驱动器/分区和唯一驱动器 ID

c++ - Lua/Luabind : Objects constructed by objects remain allocated

c++ - luabind 没有启动我定义的功能

c++ - 如何使用 Luabind 和 C++ 创建 Assets 管理类?

c++ - 由于对具有 std::string 的方法的 undefined reference ,链接 webrtc-native 时出错