Получать любое уведомление при вызове функции undefined в lua

В коде 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. Я хочу изменить источник, чтобы сопоставить неопределенную функцию с функцией обратного вызова, но это неверно.


person tfzxyinhao    schedule 24.10.2012    source источник


Ответы (1)


Как мне получить уведомление, когда я вызываю неопределенную функцию в lua.

Вы этого не сделаете. Не так, как вы это имеете в виду.

Вы можете подключить __index метаметод к зарегистрированному метатаблицу WindowUI (* стон*). Ваш метаметод получит только те пользовательские данные, по которым он был вызван, и ключ, который был использован.

Но вы не можете отличить вызов функции от простого доступа к переменной-члену, поскольку Lua не делает различий между ними. Если вы возвращаете функцию из своего метаметода, а пользователь вызывает оператор вызова функции при возврате из метаметода, то он будет вызван. В противном случае они получают функцию, с которой можно поиграть по своему усмотрению. Они могут хранить это, передавать, называть позже, как угодно. Это ценность, как и любая другая.

person Nicol Bolas    schedule 24.10.2012
comment
при компиляции файла * .lua lua использует хеш для сопоставления функции C с функцией lua, например __index, поэтому я хочу изменить часть хеша, которая может сопоставить неопределенную функцию с функцией по умолчанию, чтобы я мог установить значение по умолчанию функция, чтобы получить это. - person tfzxyinhao; 24.10.2012
comment
что вы имеете в виду под компилированием * .lua? код lua не компилируется, а интерпретируется / выполняется. оценка выражения / вызова win: resize (800, 600) происходит в то время, когда выполнение кода достигает этой точки. - person lipp; 24.10.2012
comment
@tfzxyinhao: lua использует хеш для сопоставления функции C с функцией lua, например __index Нет. Вы думаете, что способ слишком низкоуровневый. Не думайте о хэшах и т. Д. Есть таблицы, ключи, которые соответствуют значениям. Как это реализовано, значения не имеет. Важно то, что когда Lua пытается получить доступ к пользовательским данным, как если бы это была таблица, он вызывает метаметод __index для этих пользовательских данных. Это ваша задача - вернуть правильную функцию для вызова Lua. Период. Никаких хешей, никаких уведомлений; просто верните функцию. - person Nicol Bolas; 24.10.2012