我有一个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);
}
我很确定这有一个简单的解决方案,但我完全难过了。任何帮助将不胜感激。
答案 0 :(得分:3)
在推送索引之后,表格在堆栈中的另一个位置。所以这样的事情应该有效:
if(lua_istable(lua,-1)) {
lua_pushnumber(lua,1);
lua_gettable(lua,-2);
...
答案 1 :(得分: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);
}