如何在Lua回调中检测可选的第一个参数?

时间:2019-06-21 14:10:56

标签: c++ c lua

我在C / ++中有一个LUA回调,并且尝试使用lua_gettop()来检测可选的第一个参数。问题是lua_gettop(L) == 1始终为true,即使我未在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 :(得分:0)

正如@nate在他的评论中提到的那样,任何“基于对象”的函数调用(即,调用成员函数或方法,如果您愿意)都会导致对象成为Lua堆栈中的第一件事。假设没有其他作为参数传递给成员函数,则lua_gettop将返回1

对于检查成员函数的可选第一个参数(如果使用的是基于对象的调用,该参数位于Lua堆栈的索引2上),像luaL_optstring这样的函数非常有用。 (参考页here。如果您不知道,在luaL中有前缀lauxlib.h的函数。)对于其他类型,也有等效的函数。它允许提供索引和默认参数:如果Lua堆栈上给定索引处存在值,则将其返回;否则,将返回提供给该函数的默认值。