【问题标题】:How to Detect Optional First Parameter in Lua Callback?如何检测 Lua 回调中的可选第一个参数?
【发布时间】:2019-06-22 04:29:16
【问题描述】:

我在 C/++ 中有一个 LUA 回调,我正在尝试使用 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 堆栈中的有效索引,但是确定可选的第一个参数的正确方法是什么?

【问题讨论】:

  • 是来自 lua 'object based' 的调用,即instance:method(),如果是这样,那么第一个参数总是instance,通常是一个表。
  • @nate 不,我不相信调用是基于对象的,我只是调用诸如my_callback() 之类的方法,而不是提供实例instance:my_callback()
  • 我相信如果你有一个可以有 1 个参数的函数,对于每个调用 lua 将把堆栈提供的参数或 nil
  • @AndrewKashpur 我使用了lua_isnoneornil(L, 1),它返回了 0...事实上,我使用了所有的 lua_is... 函数,唯一的正返回来自lua_istable()
  • 你能发布更多调用回调的 lua 代码的上下文吗?假设它不是实例方法,第一个('1')堆栈值应该是您的参数。所以如果不是,其他东西就会被压入堆栈

标签: c++ c lua


【解决方案1】:

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

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

【讨论】:

  • 感谢您的评论,但我认为我不是在进行基于对象的函数调用......或者我是(参见有问题的 LUA 代码)?当我在 LUA 中为回调提供参数时,lua_gettop(L, 1) == 1 仍然是 true,而我的参数是 1。您的回复说,如果我使用基于对象的调用,我的参数将位于索引 2,但事实并非如此。
  • 我不熟悉 lua_map_ 类型,但您正在索引它,就像使用 operator[] 的数组一样。也许这就是为什么您似乎在堆栈顶部有一张桌子。此外,无论索引1 是什么,您的可选参数是否仍位于索引2
  • lua_map_ 行与场景无关......但是,经过进一步测试,您似乎是对的,因为我的可选参数位于 2
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多