从C++访问Lua表中的嵌套表

我有一个 Lua 函数,它返回一个字典表,其中一个放入返回表中的值是另一个表,如下面的 Lua 函数所示。

function tableWithinTable()
    local ret = {}
    ret["a"] = 1
    ret["b"] = {1,2,3}
    ret["c"] = 3
    return ret
end

我该如何访问内部表?

我知道我可以访问表,因为我可以进入以下 if 语句。我的当前尝试读取表也包括在内。

lua_pushstring("b");
lua_gettable(lua,1);
if(lua_istable(lua,-1))
{
    // 在这里执行任何操作。
    lua_pushnumber(lua,1);
    lua_gettable(lua,-1); // 到这里时崩溃到桌面
    std::cout << lua_tonumber(lua,-1) << std::endl;
    lua_pop(lua,1);
}

我相信这有一个简单的解决方法,但我完全不知道该如何处理。非常感谢任何帮助。

点赞
用户240633
用户240633

当你将索引推入栈中后,表格在堆栈中会移动一个插槽。因此,像这样的东西应该可以工作:

if(lua_istable(lua,-1)) {
  lua_pushnumber(lua,1);
  lua_gettable(lua,-2);
  ...
2012-08-16 03:17:46
用户1008957
用户1008957

通常使用函数 lua_getfield(用于字符串索引)或 lua_rawgeti(用于数字索引)比原始函数 lua_gettable 更容易。

特别是这可以避免在栈上多余的值导致索引错误。

示例可以重写为:

lua_getfield(lua, 1, "b");
if(lua_istable(lua, -1))
{
    lua_rawgeti(lua, -1, 1);
    std::cout << lua_tonumber(lua,-1) << std::endl;
    lua_pop(lua, 1);
}
2012-08-16 15:19:52