2016-09-01 2 views
2

나는 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; 
    } 

답변

2

첫 번째 : 왼쪽. A + B의 경우 A의 __add가 호출됩니다.

두 번째 : 아니요, 죄송합니다. 인수가 순서대로 전달됩니다 마지막으로

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

(왼쪽 왼쪽으로 유지됩니다, 옳고있을 것입니다) : 나는 완전히 확실하지 않다. 나는 심각하게 그것이 모두와 __add 전화 의심, 그리고 용의자 (왼쪽에서 오른쪽으로 (수학 연산의 순서에 따라) 이동합니다. 그것은 확실히 1 + 1/2에 대한 연산 순서를 따릅니다.

+0

오른쪽에서 왼쪽으로 (userdata에 의해) 나타나는 것처럼 보이지만, 어떤 경우 든 한 번에 하나씩입니다. 감사 – Leo