使用C API有序循环遍历lua表。

考虑以下lua表格:

foo = {
    bar1 = {a = 1, b = 2, c = "hello"},
    bar2 = {a = 5, b = 2, c = "bbq"},
    bar3 = {a = 76, b = 13, c = "pwnd"}
}

我正在尝试使用lua C API迭代此表格以检索键名bar1、bar2和bar3。我使用了lua_next(L,-2)函数进行迭代,如许多人建议的那样,但问题是它以随机顺序返回元素。每次运行顺序都会改变。

我使用以下代码:

for( lua_pushnil(L); lua_next(L, -2) != 0; lua_pop(L, 1) )
{
    printf("%s\n", lua_tostring(L, -2));
}

大多数情况下,输出是无序的,如bar2 bar1 bar3。当运气好时,它是有序的。有没有一种简单的方法以有序的方式循环遍历表格键?如果要等价的代码,但是有序的吗?谢谢!

编辑:

我知道我使用的是映射而不是数组。但是在lua脚本中,我们有ipairs可以很好地适用于此情况。我正在研究C API的等效物。我找到了this stackoverflow answer,它给出了不同的答案,但对我不起作用,因此我想知道该答案是否好或相关。

点赞
用户107090
用户107090

不行。Lua 遍历表的顺序是未定义的。

如果您知道键的形式为 barXXX,那么您可以按照您希望的顺序动态地创建这些键作为字符串,然后从表中获取相应的值。

2014-12-16 17:17:33
用户210634
用户210634

查看 Lua 的文档,Lua 支持的主要数据结构是哈希表。考虑到它总是一个哈希表,你可能想重新实现 foo 作为一个数组bar1bar2 等可以作为数组入口的一部分,如下所示:

foo = {}
foo[0] = {name='bar1', ...}
foo[1] = {name='bar2', ...}
    ...

或者像 @lhf 建议的那样,在 for 循环中构建 bar 的名称(如果你知道它们是有序的),然后从 foo 表中检索值。

2014-12-16 17:38:47
用户312586
用户312586

将名称放入 C 数组中,然后在 C 中对它们进行排序。

正如其他人所说,表的哈希部分返回的键的顺序不能保证。

或者,使用类似数组的结构,这样你就可以使用数组部分:

foo = {
  {name = 'bar1', a = 1,  b = 2,  c = "hello"},
  {name = 'bar2', a = 5,  b = 2,  c = "bbq"},
  {name = 'bar3', a = 76, b = 13, c = "pwnd"}
}

因此,您可以使用 ipairs 或等效的 for i=1,#foo 以顺序迭代项目。

2014-12-16 18:50:29