Lua 元事件参数顺序

我正在使用Lua API来重写我的C++对象的元事件,封装为用户数据。然而,一些元事件可以采用可能是用户数据或常规值的多个参数,我可以将其转换为用户数据。例如,__add、__eq、__concat等。

首先,对于这些元事件,如果我将两个用户数据相加,那么哪个__add会被调用,它只会被调用一次吗?如果我有两种不同类型的用户数据具有不同的__add钩子(尽管它们具有不同的返回结果是不好的实践),这是相关的。

其次,对于像这样的示例:2 + userdata而不是userdata + 2,是否保证用户数据始终在堆栈上显示为第一个?这将使我的实现显着变得更加简单,除了__index之外,我没有找到有关元事件详细行为的文档。

最后,如果您添加多个对象的话Lua的行为如何?从未使用C API的元表测试来看,似乎是PEMDAS排序。例如userdata1+3+userdata2+userdata3+nonuserdata,但我没有找到任何参考来确认这一点。__add只会调用一次吗,所有参数都在堆栈上调用,调用第一个用户数据的__add,或者从一个方向传播创建临时r值?

这里是我从堆栈中获取__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;
    }
点赞
用户3524201
用户3524201

首先: 左侧。在 A + B 的情况下,会调用 A 的 __add。

其次: 不,抱歉。参数按顺序传递(左侧保持左侧,右侧保持右侧)。

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

最后: 我不完全确定。我严重怀疑它会将所有参数都传递给 __add,而我认为它会按顺序从左到右移动(遵循数学中的运算顺序)。对于 1 + 1 / 2,它肯定遵循运算顺序。

2016-09-01 17:36:08