2012-10-24 4 views
4

C++ 코드에서 :때 루아에서 호출 정의되지 않은 기능

class CWindowUI { 
    public CWindowUI(const char* title,int width,int height); 
    ..... 
}; 

static int CreateWindow(lua_State *l) 
{ 
    int   width,height; 
    char  *title; 
    CWindowUI **winp, *win; 

    name = (char *) luaL_checkstring(l, 1); 
    width= lua_tounsigned(l, 2); 
    height= lua_tounsigned(l, 3); 

    win = new CWindowUI(title,width,height); 
    if (win == NULL) { 
     lua_pushboolean(l, 0); 
     return 1; 
    } 

    winp = (CWindowUI **) lua_newuserdata(l, sizeof(CWindowUI *)); 
    luaL_getmetatable(l, "WindowUI"); 
    lua_setmetatable(l, -2); 
    *winp = win; 

    return 1; 
} 

루아 코드에서 :

local win = CreateWindow("title", 480, 320); 
win:resize(800, 600); 

지금 내 질문은 :

기능 CreateWindow라는 이름의 객체를 반환합니다 win이고 기능은 resize입니다. 루아에서 정의되지 않은 함수를 호출 할 때 어떻게 알림을 받습니까?

통지에는 "resize" 문자열과 800,600 인수가 포함되어야합니다. 정의되지 않은 함수를 콜백 함수에 매핑하기 위해 소스를 수정하고 싶지만 올바르지 않습니다.

답변

2

루아에서 정의되지 않은 함수를 호출 할 때 어떻게 알림을 받습니까?

그렇지 않습니다. 네가 말하는 그런 의미가 아니야.

an __index metamethod을 등록 된 "WindowUI"메타 테이블 (* 신음 *)에 연결할 수 있습니다. 메타 메서드는 호출 된 사용자 데이터와 사용 된 키만 가져옵니다.

그러나 루아은 이들을 구분하지 않으므로 함수 호출과 단순히 멤버 변수를 구분할 수 없습니다. 메타 메서드에서 함수를 반환하고 사용자가 메타 메서드에서 반환 할 때 함수 호출 연산자를 호출하면 호출됩니다. 그렇지 않으면, 그들은 적합하다고 생각하는대로 놀 수있는 함수를 얻습니다. 그들은 그것을 저장할 수 있고, 그것을 주변에 전달하고, 나중에 호출 할 수 있습니다. 그것은 다른 어떤 것과 마찬가지로 가치입니다.

+0

* .lua 파일을 컴파일 할 때 lua는 C 함수를 "__index"와 같은 lua 함수에 매핑하기 위해 해시를 사용하므로 정의되지 않은 함수를 기본 함수로 매핑 할 수있는 해쉬 부분을 수정하려고합니다. 내가 그것을 얻을 수있는 기본 기능을 설정할 수 있습니다. – tfzxyinhao

+1

"* .lua를 컴파일하면"무엇을 의미합니까? 루아 코드는 컴파일되지 않지만 해석/실행됩니다. 표현식/호출 "win : resize (800, 600)"의 호출이이 시점에 발생하면 코드 실행이이 시점에 도달합니다. – lipp

+0

@tfzxyinhao : "* lua는 C 함수를"__index "와 같은 루아 함수에 매핑하기 위해 해쉬를 사용합니다. *"No * 당신은 저수준이라고 생각합니다. "해시"등을 생각하지 마십시오. 값에 매핑되는 테이블, 키가 있습니다. 그것이 어떻게 구현되었는지는 부적합합니다. 중요한 것은 루아가 테이블 인 것처럼 루아가 사용자 데이터에 접근하려 할 때, 루아는 그 userdata에 대해'__index' 메타 메소드를 호출 할 것입니다. 루아가 전화를 걸기위한 적절한 함수를 돌려주는 것은 당신의 일이다. 기간. 해시도없고 알림도 없습니다. 그냥 함수를 반환합니다. –

관련 문제