如何在不修改堆栈的情况下在堆栈上转储表的内容?

时间:2017-10-17 12:56:03

标签: go stack lua-table lua-api

首先,我非常喜欢Lua的n00b。从昨天晚上开始。 顺便说一下,我正在使用golua,据我所知,它非常接近通常的C API。因此,C中的任何建议都可能适用于我的案例。

无论如何,要问题。我(很自然地)在我的实验中很早就将Lua集成到Go应用程序中,因此测试了各种方法和方法。

我要做的第一件事就是使用表(基于JSON对象)调用Lua函数,在表上执行一些操作然后返回它。该表可能包含嵌套表。脚本部分在这里不是问题,我想我有点覆盖。 但是,我想窥视堆栈内部以验证我传递给函数的内容是否正确。同样也要看看Lua返回的值。

但是怎么样?

这一位取from the reference manual

static void stackDump (lua_State *L) {
  int i;
  int top = lua_gettop(L);
  for (i = 1; i <= top; i++) {  /* repeat for each level */
    int t = lua_type(L, i);
    switch (t) {

      case LUA_TSTRING:  /* strings */
        printf("`%s'", lua_tostring(L, i));
        break;

      case LUA_TBOOLEAN:  /* booleans */
        printf(lua_toboolean(L, i) ? "true" : "false");
        break;

      case LUA_TNUMBER:  /* numbers */
        printf("%g", lua_tonumber(L, i));
        break;

      default:  /* other values */
        printf("%s", lua_typename(L, t));
        break;

    }
    printf("  ");  /* put a separator */
  }
  printf("\n");  /* end the listing */
}

然而,当堆栈包含一个表时,这只会打印“table”,如果表的内容是我们真正感兴趣的东西,这当然不是非常有用。

我知道如何从堆栈中“弹出”一个表(使用lua_next()等),但这当然会修改堆栈,所以在调用lua函数之前我不能使用它...

我搜索过高低,但我发现的所有内容都与上面的代码段类似。

编辑:这是为了找出为什么这个lua代码不会打印任何内容:

for k, v in ipairs(arg) do
    print(k .. ' = ' .. v)
end

其中arg是函数的参数(表)。

编辑2:咳咳,事实证明上面应该使用pairs(arg)。但是,一般而言,问题的用处仍然存在。

编辑3:找到ref.manual源

1 个答案:

答案 0 :(得分:0)

获取表键值的常用方法是使用Lua堆栈操作 lua_getfield()。该表应该已经在堆栈中。 lua_getfield()将获取特定键的值并将其推送到堆栈上。因此,您可以弹出这个值,因为您不想更改任何堆栈。它不会改变已经在堆栈中的表。

如果你真的想要修改表格,你可能只需要使用lua堆栈来实现它,这就是它的工作方式。