LUA_MULTRET无法按预期工作。

为什么最后一次调用 lua_pcall(L, 0, LUA_MULTRET, 0) 不会在堆栈上留下任何结果?运行上面的程序的输出为:

In foo(): pushed 3 elements...
After foo(): 3 results left on the stack...
In foo(): pushed 3 elements...
After foo(): 3 results left on the stack...
In foo(): pushed 3 elements...
After foo(): 0 results left on the stack...

我使用的是 Lua 5.1.5 版本...

点赞
用户869951
用户869951

在第一次调用中,您正在将C函数“foo”推入堆栈然后调用它。但是,luaL_loadstring创建一个块,因此在第二次和第三次调用中,您正在推送一个块然后调用它,但是该块不返回任何内容,该块只调用foo()。因此,

lua_pcall(L, 0, 3, 0);

在Lua堆栈上创建了3个nil,因为Lua确保您要求的3个值都在那里,即使块未返回任何内容。另外,

lua_pcall(L, 0, LUA_MULTRET, 0);

不返回任何内容,因为该块未返回任何内容。

如果您想从Lua执行foo,请将foo全局变量推入堆栈:

lua_getglobal(L, "foo");
lua_pcall(L, 0, LUA_MULTRET, 0);

或者,使该块返回foo()的结果:

luaL_loadstring(L, "return foo()");
lua_pcall(L, 0, LUA_MULTRET, 0);
2013-12-29 19:11:16