Lua 元事件参数顺序

Lua Meta Event Argument Order

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

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

其次,对于这样的示例:2 + userdata 而不是 userdata + 2,是否可以保证用户数据始终首先出现在堆栈中?这将使我的实现更加直接,而且除了 __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 的操作顺序。