Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定Lua从C扩展函数内部期望的返回值的数量_C_Lua - Fatal编程技术网

确定Lua从C扩展函数内部期望的返回值的数量

确定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函数能够确定其调用者表示的预期返回值的数量可能是有利的,这样可以避免计算调用者没有请求的返回值(如果计算需要很长时间): 假设

每次调用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;
}