Как определить необязательный первый параметр в обратном вызове Lua? - PullRequest
2 голосов
/ 21 июня 2019

У меня есть обратный вызов LUA в C / ++, и я пытаюсь использовать lua_gettop() для обнаружения необязательного первого параметра. Проблема в том, что lua_gettop(L) == 1 всегда верно, даже если я не предоставляю никаких параметров в LUA.

Вот основы моей функции обратного вызова в C / ++:

int LuaFile::l_cpp_my_callback(lua_State *L) {
    LuaFilePtr my_this = lua_map_[L];

    if ( lua_gettop(L) == 0 ) {
        // I never get here
    } else if(lua_gettop(L) == 1) {
        // Always gets here
    } else {
        return 1;
    }

    return 1;
}

Это контекст вызова в коде LUA:

function my_function()
    if ... then
        if not ... then
            if ... then
                someOtherCallback(param, param, param)
                someOtherCallback(param)
            end
            if ... then
                someOtherCallback(param)
            end
        end

    else
        if not ... then
            if ... then
                someOtherCallback(param, param, param)
                someOtherCallback(param)
            end
            if ... then
                someOtherCallback(param)
            end
        end
        var = my_callback()
        ...
    end
end

Я использовал lua_gettype(L, 1) для отладки, и он возвращает «5», что lua_typename(L, 5) говорит, что это «таблица». Я предполагаю, что это метатабельная часть стека?

Я понимаю, что 0 не является допустимым индексом в стеке LUA, но тогда как правильно определить необязательные первые параметры?

1 Ответ

0 голосов
/ 21 июня 2019

Как упомянул в своем комментарии @nate, любой вызов "объектной" функции, то есть вызов функции-члена или, если хотите, метода, приводит к тому, что объект является первым в стеке Lua. lua_gettop вернет 1, при условии, что больше ничего не было передано функции-члену в качестве аргумента.

Что касается проверки необязательного первого аргумента функции-члена, который был бы расположен по индексу 2 в стеке Lua, если бы вы использовали объектный вызов, такие функции, как luaL_optstring, очень полезны. (Справочная страница здесь . В случае, если вы не знаете, функции с префиксом luaL находятся в lauxlib.h.) Существуют также эквивалентные функции для других типов. Это позволяет предоставить индекс и аргумент по умолчанию: если значение существует по данному индексу в стеке Lua, оно возвращается; в противном случае возвращается значение по умолчанию, предоставленное функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...