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 的操作顺序。
我正在使用 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 的操作顺序。