我认为lua_settop()的文档很清楚:
void lua_settop(lua_State * L,int index);
接受任何可接受的索引,或0,并将堆栈顶部设置为此索引。如果 新顶部比旧顶部大,然后新元素填充为零。如果 index为0,然后删除所有堆栈元素。
......然而,这段代码:
lua_settop(L, 0);
top = lua_gettop(L);
if (lua_isnoneornil(L, top)) {
printf("Invalid stack (nil)");
}
else {
// WTF?
printf("? %d -> %s", top, lua_typename(L, lua_type(L, top)));
}
收率:
? 0 -> table
是什么给出了?
如何检查堆栈是否为空?使用(lua_gettop(L)== 0)?
如果是这样,为什么还有一个lua_isnone()调用?
答案 0 :(得分:5)
lua_gettop
的文档很简单地回答了您的问题:
返回堆栈中顶部元素的索引。因为指数 从1开始,这个结果等于中的元素个数 stack(,因此0表示空堆栈)。
答案 1 :(得分:1)
仅供其他任何偶然发现此问题的人参考,这个问题的另一个答案是,来自lua docs:
大多数查询函数接受可用堆栈空间内的任何值作为索引,即索引,直到通过lua_checkstack设置的最大堆栈大小。这些指数称为可接受指数。更正式地说,我们定义了一个可接受的索引如下:
(index < 0 && abs(index) <= top) ||
(index > 0 && index <= stackspace)
请注意,0绝不是可接受的索引。
如果lau_gettop()返回0,则无法调用is_none()和isnoneornil(),因为0不是可接受的索引。