【问题标题】:Lua Accessing a table's Keys and ValuesLua 访问表的键和值
【发布时间】:2012-09-08 15:02:12
【问题描述】:

我想在关卡编辑器中读取 Lua 文件,以便以可视格式显示其数据以供用户编辑。

如果我有这样的 Lua 表:

properties = {
  Speed = 10,
  TurnSpeed = 5
}

Speed 显然是键,10 是值。如果我知道这样的键,我知道我可以访问该值(假设表已经在堆栈上):

lua_pushstring(L, "Speed");
lua_gettable(L, idx); 
int Speed = lua_tointeger(L, -1);
lua_pop(L, 1); 

我想要做的是在 C++ 中访问键的名称和相应的值。这可以做到吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: c++ lua lua-table


    【解决方案1】:

    这由lua_next function 覆盖,它遍历表的元素:

    // table is in the stack at index 't'
    lua_pushnil(L);  // first key
    while (lua_next(L, t) != 0)
    {
      // uses 'key' (at index -2) and 'value' (at index -1)
      printf("%s - %s\n", luaL_typename(L, -2), luaL_typename(L, -1));
      // removes 'value'; keeps 'key' for next iteration
      lua_pop(L, 1);
    }
    

    lua_next 键从表的,嗯,键,所以你需要在迭代时将它保留在堆栈中。每次调用都会跳转到下一个键/值对。一旦它返回 0,那么你就完成了(当键被弹出时,下一个键没有被按下)。

    显然,在您正在迭代的表中添加或删除元素可能会导致问题。

    【讨论】:

    • 为什么要为下一次迭代保留密钥?
    • 键由lua_next()弹出,然后将下一个键/值对放入堆栈(它必须识别“下一个”元素毕竟t只是表,不是当前索引)。
    • @DavidC:因为如果你不这样做,lua_next 就不起作用。毕竟,这不是魔术。它需要某种方式来了解“下一步”是什么意思。它为此使用密钥。您从nil 的“密钥”开始,它告诉lua_next 获取“第一个”密钥。然后它使用当前密钥来决定下一个密钥在哪里。它与数组循环中的索引或 C++ 中的迭代器没有什么不同。
    猜你喜欢
    • 2017-03-31
    • 2019-01-19
    • 2016-08-09
    • 2018-04-12
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多