我正在使用 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/