我对 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 版]
错误在哪里?
该错误是lua_next(L, -2)一致的,因为 -2 指的是堆栈顶部减一,这恰好是 的最后一个参数print。
lua_next(L, i)代替使用。
更新:在开发阶段移动代码时,Lua 堆栈索引会发生浮动,因此一般建议是int t = lua_gettop(L)在获取/推送/考虑值后使用 sml 固定索引,并使用它t来代替-n(尽管这种特定情况似乎是排序的)按键错误。)