为什么空堆栈的顶部是lua中的一个表?

时间:2012-06-14 09:01:35

标签: c lua

我认为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()调用?

2 个答案:

答案 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不是可接受的索引。