遍历一个table,肯定是不知道table的每个key的,所以lua_getfield肯定是不可行的。
要遍历table,最主要的是lua_next函数,该函数主要接受一个int参数,代表当前table所在的索引,索引之上应该需要一个key,每次lua_next都会从当前的key遍历下一个key,于是我们想要得到第一个key,则只需要压入一个nil就行了。
当lua_next返回0的时候,代表遍历完毕,它会把table上的key进行弹出操作;当当前有key的时候,返回非0值,同时将key和value压入栈,栈顶就是value,-2则是key。我们可以取到当前的value,然后将key留在栈中继续下一次的遍历。
上代码:
{
LuaStackGuard stackChecker(L);
lua_getglobal(L, _pszName);
if (!lua_istable(L, -1))
{
// LUA_TNIL
lua_pop(L, 1);
return false;
}
int tableIndex = lua_gettop(L);
// push the first key
lua_pushnil(L);
while (0 != lua_next(L, tableIndex))
{
// stack : table key value
// Done, pop all fields
lua_pop(L, 1); // stack : table key
}
// last key will pop the key, stack : table
lua_pop(L, 1);
return true;
}