首先,我非常喜欢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源
答案 0 :(得分:0)
获取表键值的常用方法是使用Lua堆栈操作 lua_getfield()。该表应该已经在堆栈中。 lua_getfield()将获取特定键的值并将其推送到堆栈上。因此,您可以弹出这个值,因为您不想更改任何堆栈。它不会改变已经在堆栈中的表。
如果你真的想要修改表格,你可能只需要使用lua堆栈来实现它,这就是它的工作方式。