나는 Lua API를 사용하여 사용자 데이터로 래핑 된 내 자신의 C++ 객체에 대한 메타 이벤트를 무시합니다. 그러나 일부 메타 이벤트는 사용자 데이터 또는 사용자 데이터로 변환 할 수있는 일반 값일 수있는 여러 인수를 사용할 수 있습니다.Lua 메타 이벤트 인수 순서
첫 번째로 두 개의 사용자 데이터를 함께 추가하면 __add가 호출되는 이러한 메타 이벤트에 대해 한 번만 호출되는 것입니까? 예를 들어, __add, __eq, __concat 등이 있습니다. 이것은 __add 후크가 다른 두 개의 다른 유형의 사용자 데이터가있는 경우 적합합니다 (서로 다른 결과를 반환하는 것은 좋지 않을 수 있음).
둘째, userdata + 2
대신에 2 + userdata
과 같은 예를 들면, 사용자 데이터가 항상 스택에 처음으로 표시된다는 보장이 있습니까? 이것은 나의 구현을 훨씬 더 간단하게 만들 것이고, 나는 __index 이외의 메타 - 이벤트의 상세한 동작에 대한 많은 문서를 발견하지 못했다.
마지막으로, 여러 객체를 추가하면 루아의 행동은 무엇입니까? C API를 사용하지 않는 메타 테이블을 사용한 테스트에서 PEMDAS가 주문한 것처럼 보입니다. 나는. userdata1 + 3 + userdata2 + userdata3 + nonuserdata
,하지만 이것을 확인할 수있는 참조가 없습니다. __add는 스택의 모든 인수와 함께 한 번만 호출되거나, 첫 번째 userdata의 __add를 호출하거나, 임시 방향 값을 만드는 한 방향에서 전파됩니까?
다음은 __arg에 대해 스택에서 args를 취하는 방법의 예입니다. 인수의 순서가 보장되면 간단합니다.
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;
}
오른쪽에서 왼쪽으로 (userdata에 의해) 나타나는 것처럼 보이지만, 어떤 경우 든 한 번에 하나씩입니다. 감사 – Leo