Lua 访问表的键和值

Dav*_*son 4 c++ lua lua-table

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

如果我有一个像这样的 Lua 表:

properties = {
  Speed = 10,
  TurnSpeed = 5
}
Run Code Online (Sandbox Code Playgroud)

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

lua_pushstring(L, "Speed");
lua_gettable(L, idx); 
int Speed = lua_tointeger(L, -1);
lua_pop(L, 1); 
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 7

lua_next函数涵盖了这一点,该函数迭代表的元素:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

lua_next键离开表的键,因此在迭代时需要将其保留在堆栈中。每次调用都会跳转到下一个键/值对。一旦它返回 0,那么你就完成了(当该键被弹出时,下一个键未被压入)。

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

  • @DavidC:因为如果你不这样做,`lua_next`就不起作用。毕竟,这不是魔法。它需要某种方式来知道“下一步”的含义。它使用密钥来实现这一点。您从“nil”的“键”开始,它告诉“lua_next”获取“第一个”键。然后它使用当前密钥来决定下一个密钥在哪里。它与数组循环中的索引或 C++ 中的迭代器没有什么不同。 (3认同)