如何在C API中生成ipairs(而不是成对)行为

Pau*_*aul 11 c api lua

在Lua,pairsipairs可以遍历以不同的顺序相同的元件:

> 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
Run Code Online (Sandbox Code Playgroud)

当使用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 ...
}
Run Code Online (Sandbox Code Playgroud)

但我不清楚表大小与连续整数键数不匹配的潜在性能问题:

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
Run Code Online (Sandbox Code Playgroud)

如果这确实是ipairs的方式,那么是否有一种简单的方法可以开始使用lua_next和最后找到的整数键来继续遍历表的其余部分,从而避免再次遍历整数键部分?这样做有两次我会看到一些整数键吗?

dau*_*tor 9

你只需使用rawgeti,直到得到一个零密钥:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

通过查看源代码,您可以看到这是ipairs内部的工作:http://www.lua.org/source/5.1/lbaselib.c.html#ipairsaux