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

Lua コードでは:

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

今私の質問は:

関数CreateWindowは指定されたオブジェクトを返しますがwin、関数resizeは定義されていません。Lua で未定義の関数を呼び出したときに通知を受け取るにはどうすればよいですか?

通知には、文字列"resize"と引数が含まれます800,600。未定義の関数をコールバック関数にマップするようにソースを変更したいのですが、正しくありません。

4

1 に答える 1

2

lua で未定義の関数を呼び出したときに通知を受け取る方法を教えてください。

あなたはそうしない。あなたがそれを意味する方法ではありません。

登録した" __indexWindowUI " メタテーブルにメタメソッドをフックできます (*groan*)。メタメソッドは、呼び出されたユーザーデータと使用されたキーのみを取得します。

しかし、Luaはこれらを区別しないため、関数呼び出しと単にメンバー変数へのアクセスを区別することはできません。メタメソッドから関数を返し、ユーザーがメタメソッドからの戻り時に関数呼び出し演算子を呼び出すと、関数が呼び出されます。それ以外の場合は、必要に応じて操作する関数を取得します。彼らはそれを保存したり、渡したり、後で呼び出したりすることができます。他のものと同じように、それは値です。

于 2012-10-24T04:26:57.093 に答える