0

我有一个返回字典表的 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))
{
    //whatever is in here is executed.
    lua_pushnumber(lua,1);
    lua_gettable(lua,-1); //crashes to desktop here
    std::cout << lua_tonumber(lua,-1) << std::endl;
    lua_pop(lua,1);
}

我很确定有一个简单的解决方案,但我完全被难住了。任何帮助将非常感激。

4

2 回答 2

3

推入索引后,该表在堆栈中又多了一个插槽。所以这样的事情应该有效:

if(lua_istable(lua,-1)) {
  lua_pushnumber(lua,1);
  lua_gettable(lua,-2);
  ...
于 2012-08-16T03:17:46.643 回答
0

通常使用函数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-16T15:19:52.953 回答