在Lua中,pairs
和ipairs
可以以不同的顺序遍历相同的元素:
> t = {[1]=1, [2]=2, [3]=3}
> for k,v in pairs(t) do print(k,v) end
2 2
1 1
3 3
> for k,v in ipairs(t) do print(k,v) end
1 1
2 2
3 3
使用C API时,我只看到一种用于遍历表的工具:lua_next()函数的作用与
pairs()
Lua函数的作用非常相似,后者产生上面显示的2-1-3顺序。我正在寻找一种有效的C方法来顺序地迭代表的整数键(ipairs的C API版本)。
天真地,我考虑了:
int tableLength = luaL_len(L, tableIndex);
for (i=0, i++, i>tableLength){
// if t[i] is not null ...
}
但是我不清楚表大小与连续整数键的数量不匹配的潜在性能问题:
t = {[1]=1, [2]=2, [4]=4} -- has a (reported) length of 4
t = {[1]=1, [2]=2, [40000]=4} -- has a (reported) length of 2
如果确实是ipairs的方式,那么是否有一种简单的方法来开始将lua_next与最后找到的整数键一起使用,以继续遍历表的其余部分,而避免再次遍历整数键部分?这样有机会我会两次看到一些整数键吗?
最佳答案
您只需要使用rawgeti,直到获得nil键:
// Tabs is on top of stack
for ( int i=1 ; ; i++ ) {
lua_rawgeti(L,-1,i);
if ( lua_isnil(L,-1) ) {
lua_pop(L,1);
break;
}
/* Do something */
lua_pop(L,1);
}
通过查看源代码,您可以看到ipairs在内部执行的操作:http://www.lua.org/source/5.1/lbaselib.c.html#ipairsaux