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

标签 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

使用 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

关于c - 如何在 C API 中生成 ipairs(而不是 pairs)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149178/

相关文章:

c - 使用 fputc 和 fgetc 写入文件最终只有 0

c++ - 设计更好的API接口(interface),以将结构从一个类传递到另一个类

node.js - OpenSSL Node.js 错误无起始行

c++ - 构建 luabind 时出现错误 C2665

c - 如何在 MPI 中使用未阻塞的 Bcast?

c - C中的线程

php - 需要有关构建无状态 Web 应用程序的信息

objective-c - lua_touserdata 返回 null

Lua 模式 - 为什么自定义集 '[+-_]' 匹配字母数字字符?

c - 向 pthread 发送信号以中止休眠