为什么空栈的顶部在 Lua 中被称为“table”?

我认为lua_settop()的文档非常清晰:

void lua_settop(lua_State *L,int index);

接受任何可以接受的索引,或者0,并将堆栈顶部设置为此索引。如果新顶部大于旧顶部,则新元素将填充nil。如果索引为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()函数呢?

点赞
用户255049
用户255049

你的问题可以通过 lua_gettop 的文档轻易得到答案:

返回堆栈中顶部元素的索引。由于索引从1开始,因此该结果等于堆栈中元素的数量( 因此0表示堆栈为空)。

2012-06-14 09:15:28
用户353820
用户353820

仅供其他遇到此问题的人参考,此问题的另一个答案来自Lua文档:

大多数查询函数接受堆栈空间内任何值作为索引,也就是索引直到您通过lua_checkstack设置的最大堆栈大小。这些索引称为可接受的索引。更正式地说,我们定义一个可接受的索引如下:

 (index < 0 && abs(index) <= top) ||
 (index > 0 && index <= stackspace)

请注意,0永远不是可接受的索引。

如果lau_gettop()返回0,则无法调用is_none()和isnoneornil(),因为0不是可接受的索引。

2012-06-15 06:49:09