确定Lua从C扩展函数内部期望的返回值的数量
每次调用Lua中的函数时,调用站点上立即知道返回值的数量:确定Lua从C扩展函数内部期望的返回值的数量,c,lua,C,Lua,每次调用Lua中的函数时,调用站点上立即知道返回值的数量: f() --0 local a, b = f() --2 local t = {f()} --LUA_MULTRET local t = {f(), nil} --1 C API也是如此:无论是lua\u调用还是lua\u pcall都始终提供预期数量的返回值(或lua\u MULTRET) 考虑到性能,Lua函数能够确定其调用者表示的预期返回值的数量可能是有利的,这样可以避免计算调用者没有请求的返回值(如果计算需要很长时间): 假设
f() --0
local a, b = f() --2
local t = {f()} --LUA_MULTRET
local t = {f(), nil} --1
C API也是如此:无论是lua\u调用
还是lua\u pcall
都始终提供预期数量的返回值(或lua\u MULTRET
)
考虑到性能,Lua函数能够确定其调用者表示的预期返回值的数量可能是有利的,这样可以避免计算调用者没有请求的返回值(如果计算需要很长时间):
假设一个假设的lua\u numresults返回size\u t
,此函数将只生成真正需要的值,并且不会花费时间来计算保证丢失的值
另一个有趣的例子是返回序列的函数:
int range(lua_State *L)
{
size_t num = lua_numresults(L);
for(size_t i = 1; i <= num; i++)
{
lua_pushinteger(L, i);
}
return num;
}
int范围(lua_状态*L)
{
大小\u t num=lua\u numresults(L);
对于(size_t i=1;i从Lua 5.3源判断,预期的结果数位于CallInfo
结构中。为每个Lua调用创建一个新的调用信息,最新的调用信息存储在Lua_State::ci
中,似乎没有任何函数可以返回此值,但如果可以访问该结构,得到它相当简单:
#include "lua/lstate.h"
size_t lua_numresults(lua_State *L)
{
return (size_t)L->ci->nresults;
}
让我们。
#include "lua/lstate.h"
size_t lua_numresults(lua_State *L)
{
return (size_t)L->ci->nresults;
}