使用 C API 的有序 lua 表循环
Ordered lua table looping using C API
考虑以下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("%sn", lua_tostring(L, -2));
}
大多数情况下,输出是无序的,例如 bar2 bar1 bar3
.运气好的时候,就下令了。有没有一种简单的方法可以有序地循环表键?我使用的等效代码是什么,但已订购?谢谢!
编辑:
我知道我使用的是地图而不是数组。但是在 lua 脚本中,我们有 ipairs,在这种情况下可以很好地工作。我正在查看等效的C API。我找到了这个 stackoverflow 答案,它给出了不同的答案,但它对我不起作用,所以我想知道这个答案是好的还是相关的。
No.Lua 遍历表的顺序未定义。
如果您知道键的形式是 barXXX
,那么您可以按照所需的顺序将这些键动态创建为字符串,然后从表中获取相应的值。
将名称放在 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
按顺序循环访问项目。
查看 Lua 的文档,Lua 支持的主要结构是哈希表。鉴于它始终是一个哈希表,您可能希望将foo
重新实现为数组。bar1
、bar2
等可以是数组条目的一部分,如下所示:
foo = {}
foo[0] = {name='bar1', ...}
foo[1] = {name='bar2', ...}
...
或者按照@lhf的建议,只需在 for 循环中构建bar
名称(如果您知道它是按顺序排列的(并从表中检索foo
值。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 使用 C API 的有序 lua 表循环
- 在Lua中循环遍历表中的表
- 如何通过for循环从C函数返回表的表到Lua