Lua C++ 表迭代

mac*_*and 5 c++ lua

我对 lua_next 的实际工作原理有点困惑。用户定义一个表:

a={["a1"]=20,["a2"]=30}
Run Code Online (Sandbox Code Playgroud)

我想用 C++ 代码打印这个表:

inline int lua_print(lua_State* L)
{
wxString wxReturnStr=wxEmptyString;
wxString tempString=wxEmptyString;
int nargs = lua_gettop(L);

for (int i=1; i <= nargs; i++)
{
    int type = lua_type(L, i);
    switch (type)
    {

    case LUA_TNIL:
        break;

    case LUA_TBOOLEAN:
        tempString<<(lua_toboolean(L, i) ? "true" : "false");
        break;

    case LUA_TNUMBER:
        tempString<<lua_tonumber(L, i);
        break;

      case LUA_TSTRING:
          tempString<<lua_tostring(L, i);
        break;
      case LUA_TTABLE:
      {
          lua_pushnil(L);
          while(lua_next(L,-2))
          {
                const char* key=lua_tostring(L,-2);
                double val=lua_tonumber(L,-1);
                lua_pop(L,1);
                tempString<<key<<"="<<val<<"\t";
          }

          break;
      }

      default:
          tempString<<lua_typename(L, type);
        break;
    }

    wxReturnStr=wxReturnStr+tempString+"\n";
    tempString=wxEmptyString;

}

lua_pop(L,nargs);
Run Code Online (Sandbox Code Playgroud)

当我从 Lua 调用时,这段代码运行得很好:

print(a) -- Works well
Run Code Online (Sandbox Code Playgroud)

然而,假设我在 Lua 中有一张表:

b={["b1"]=10, ["b2"]=15}
Run Code Online (Sandbox Code Playgroud)

如果我将代码称为:

print(a,b) -- Twice prints only contents of b 
Run Code Online (Sandbox Code Playgroud)

我对lua_next如何工作的理解如下图:在此输入图像描述[第 1 版]

错误在哪里?

use*_*367 4

该错误是lua_next(L, -2)一致的,因为 -2 指的是堆栈顶部减一,这恰好是 的最后一个参数print

lua_next(L, i)代替使用。

更新:在开发阶段移动代码时,Lua 堆栈索引会发生浮动,因此一般建议是int t = lua_gettop(L)在获取/推送/考虑值后使用 sml 固定索引,并使用它t来代替-n(尽管这种特定情况似乎是排序的)按键错误。)