【发布时间】:2018-08-23 07:08:21
【问题描述】:
Lua 中的函数每次被调用,返回值的个数在调用处立即知道:
f() --0
local a, b = f() --2
local t = {f()} --LUA_MULTRET
local t = {f(), nil} --1
对于 C API 也是如此:lua_call 和 lua_pcall 始终提供预期数量的返回值(或 LUA_MULTRET)。
考虑到性能,Lua 函数能够确定其调用者表达的预期返回值的数量可能是有利的,以避免计算调用者未请求的返回值(如果计算需要长时间):
int getstrings(lua_State *L)
{
if(lua_numresults(L) > 0)
{
lua_pushstring(L, "a");
if(lua_numresults(L) > 1)
{
lua_pushstring(L, "b");
if(lua_numresults(L) > 2)
{
lua_pushstring(L, "c");
return 3
}
return 2;
}
return 1
}
return 0;
}
假设一个假设的lua_numresults 返回size_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;
}
序列不是“惰性”的,因此无法完成类似 f(range()) 的操作,但返回 1、2、3 等的 local a, b, c = range() 可能会找到它的用途。
有没有像lua_numresults 这样的东西或者实现其功能的方法?
【问题讨论】: