【问题标题】:Ordered lua table looping using C API使用 C API 的有序 lua 表循环
【发布时间】:2015-02-15 02:08:06
【问题描述】:

考虑以下 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 给出了不同的答案,但它对我不起作用,所以我想知道这个答案是否正确或相关。

【问题讨论】:

  • 听起来 Lua 在内部将键值存储为哈希表。如果您想保持秩序,也许更好的解决方案是将条形条目存储为列表,而不是地图

标签: c++ c lua lua-table


【解决方案1】:

没有。 Lua 遍历表的顺序是未定义的。

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

【讨论】:

    【解决方案2】:

    将名称放入 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 来按顺序迭代项目。

    【讨论】:

      【解决方案3】:

      检查 Lua 的文档,the main structure that Lua supports is a Hash Table。鉴于它总是一个哈希表,你可能想要重新实现fooas an arraybar1bar2 等可以是数组条目的一部分,如下所示:

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

      或者按照@lhf 的建议,只需在 for 循环中构建 bar 名称(如果您知道它是按顺序排列的)并从 foo 表中检索值。

      【讨论】:

      • 仅供参考,您在帐户上链接到的 vizualize.me 页面在 Opera 26.0 的“技能”部分存在一些格式问题。这是我能想到的让您知道的最佳方式:-)。
      猜你喜欢
      • 2019-02-20
      • 2015-05-31
      • 2021-04-21
      • 2019-09-18
      • 2018-06-16
      • 2011-02-17
      • 1970-01-01
      • 2014-08-19
      • 2022-01-21
      相关资源
      最近更新 更多