【发布时间】: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')堆栈值应该是您的参数。所以如果不是,其他东西就会被压入堆栈