Lua访问表的键和值

4

我希望在级别编辑器中读取一个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++中访问键的名称和相应的值。这可以实现吗?如果可以,我该如何操作?
1个回答

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);
}
lua_next 函数以表的键为基准,所以在迭代时需要将其保留在堆栈中。每次调用函数将跳转到下一个键/值对。当函数返回0时,表示迭代完成(虽然键已被弹出,但下一个键并未推入)。
显然,在迭代过程中添加或删除元素可能会导致问题。

为什么您想在下一次迭代中保留密钥? - DavidColson
关键是由lua_next()弹出,然后将下一个键/值对放入堆栈(它必须在t只是表而不是当前索引的情况下识别“下一个”元素)。 - Mario
3
@DavidC: 因为如果你不这样做,lua_next 就不起作用。毕竟它并不是魔法;它需要一些方式来知道什么是“下一个”。它使用键来完成这个任务。你从 nil 开始,这告诉 lua_next 获取“第一个”键。然后它使用当前键来决定下一个键的位置。这与在数组循环中的索引或在 C++ 中的迭代器没有任何区别。 - Nicol Bolas
@Nicol Bolas,我一直在寻找为什么需要使用lua_pushnil。你的评论给我解开了疑惑。谢谢! - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接