c++ - Lua 元事件参数顺序

标签 c++ c lua lua-api metatable

我正在使用 Lua API 来覆盖我自己包装为用户数据的 C++ 对象的元事件。但是,某些元事件可以采用多个参数,这些参数可能是用户数据或我可以转换为用户数据的常规值。例如__add、__eq、__concat等

首先,对于这些元事件,如果我将两个用户数据加在一起,就会调用其 __add ,并且它只被调用一次吗?如果我有两种不同类型的用户数据,具有不同的 __add Hook ,这是相关的(尽管它们具有不同的返回结果是不好的做法)。

其次,对于这样的例子:2 + userdata而不是userdata + 2,是否可以保证userdata总是首先出现在堆栈上?这将使我的实现更加简单,并且除了 __index 之外,我还没有找到太多关于元事件详细行为的文档。

最后,如果添加多个对象,Lua 的行为是什么?从不使用 C API 的元表测试来看,这似乎是 PEMDAS 排序。 IE。 userdata1 + 3 + userdata2 + userdata3 + nonuserdata,但我没有找到任何引用来证实这一点。 __add 是否仅使用堆栈上的所有参数调用一次,调用第一个用户数据的 __add,还是从一个方向传播创建临时右值?

下面是我如何从堆栈中获取 __arg 参数的示例,如果保证参数的顺序,这很简单。

    if (unlikely(lua_gettop(L) != 2))
    {
        return LUA_FAILURE;
    }

    Val *v = CheckLuaUserdata(L, 1);
    if (unlikely(!v))
    {
        return LUA_FAILURE;
    }

    bool allocated = false;
    Val *arg2 = lua_mgr->PullLuaValFromGenericArg(L, 2, &allocated);
    if (unlikely(!arg2))
    {
        return LUA_FAILURE;
    }

最佳答案

第一个:左边的。对于 A + B 的情况,调用 A 的 __add。

第二:不,抱歉。参数按顺序传递(左将保持左,右将保持右)

http://lua-users.org/wiki/MetatableEvents

最后:我并不完全确定。我严重怀疑它对所有这些都调用了 __add ,并且我怀疑它从左向右移动(遵循数学运算的顺序)。它当然遵循 1 + 1/2 的运算顺序。

关于c++ - Lua 元事件参数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277444/

相关文章:

c++ - 您如何从 CComSafeArray 获取底层 SAFEARRAY?

c++ - 为什么 c/c++ 浮点类型的命名如此奇怪?

sockets - 在 Luasocket 中,即使在 select 告诉它可以安全读取之后,在什么情况下 accept 调用也会阻塞?

c++ - Windows 中的 _chdir 和 SetCurrentDirectory 有什么区别?

c++ - 静态常量积分成员的基本乐趣

C 温度转换程序保持输出 0 华氏度到摄氏度

c++ - 是否可以使用另一个 lua 文件中定义的表,而该文件不需要作为当前文件中的模块?

string - 使用 string.gmatch() 通过\n 或\r 分割字符串

C++ MFC 错误 C2664

c - GDB:打印被识别的文件