【问题标题】:Determine the number of return values expected by Lua from inside a C extension function从 C 扩展函数内部确定 Lua 期望的返回值的数量
【发布时间】: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_calllua_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 这样的东西或者实现其功能的方法?

【问题讨论】:

标签: c lua


【解决方案1】:

从 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2012-01-18
    • 2015-06-02
    • 2020-01-05
    相关资源
    最近更新 更多