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

我在 C/++ 中编写了一个 LUA 回调,我正在尝试使用 lua_gettop() 来检测可选的第一个参数。问题是,即使在 LUA 中没有提供任何参数,lua_gettop(L) == 1 始终为 true。

以下是我的 C/++ 回调函数的基本信息:

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

    if ( lua_gettop(L) == 0 ) {
        // 我从来没有到达这里
    } else if(lua_gettop(L) == 1) {
        // 总是到达这里
    } 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) 表示它是一个 'table'。我猜这是堆栈的元表吗?

我了解到在 LUA 堆栈中 0 不是一个有效的索引,但是确定可选的第一个参数的正确方法是什么?

点赞
用户9922866
用户9922866

正如 @nate 在他的评论中提到的,任何“基于对象”的函数调用,也就是调用成员函数——或者如果您喜欢的话,称之为方法——都会导致对象成为 Lua 栈上的第一个元素。假设没有传递任何其他参数给成员函数,lua_gettop 将返回 1

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

2019-06-21 20:29:16