2.7 Lua代码中的可变参数

1.select处理可变参数

select(n,...) 表示获取可变参数从第 n 个参数开始的部分数据

select("#",...) 表示获取可变参数的元素个数

Lua 复制代码
function fun1(...)
    print(select("#",...));
    print(select(1,...));

    
end

fun1(1,2,3,4,5);

运行结果:

Lua 复制代码
5
1	2	3	4	5

扩展:函数多个返回值的输出打印时,如果前面的函数加了小括号只会打印第一个值,不加小括号会打印所有的值;在print中调用两个有多个返回值的函数时,第一个函数会打印第一个值,后面的函数如果没有加小括号则会打印所有的值

Lua 复制代码
function fun1(...)
    return 11,22,33;
end

function fun2(...)
    return 44,55,66;
end

print(fun1());
print((fun1()));
print("------------")
print(fun1(),fun2());

select获取可变参数,实现求和

Lua 复制代码
function sum(...)
    local sum=0;
    count=select("#",...);
    for i=1,count do
        sum=sum+(select(i,...))
    end
    return sum;
end

print(sum(1,2,3,4,5));

2.pack处理可变参数

用table.pack(...) 获取可变参数,在最后会固定追加n和参数个数

Lua 复制代码
function sum(...)
    local ti=table.pack(...);
    sum1=0;
    for k,v in pairs(ti) do
        if(k~='n')then
            sum1=sum1+v;
        end
    end
    return sum1;
end

print(sum(1,2,3,4,5));

在遇到返回值是可变参数时,可用 table.unpack(list, i, j) 获取第 i 位置到第 j 位置的返回值,list是数组,i 是起始位置返回值,j 是终止位置的返回值

Lua 复制代码
function sum(...)
    local ti=table.pack(...);
    if ti.n==1 then
        return ti[1];
    end

    if ti.n==2 then
        return ti[1],ti[2];
    end

    if ti.n==3 then
        return ti[1],ti[2],ti[3];
    end

    if ti.n==4 then
        return ti[1],ti[2],ti[3],ti[4];
    end

    if ti.n==5 then
        return ti[1],ti[2],ti[3],ti[4],ti[5];
    else
        return ti[1],ti[2],ti[3],ti[4],ti[5];
    end
end

print(table.unpack(table.pack(sum(1,2,3,4,5,6)),2,5));

运行结果:

Lua 复制代码
2	3	4	5

可变参数当成表来处理

Lua 复制代码
function sum(...)
    local ti={...};
    for index, value in pairs(ti) do
        print(index,value);
    end
end

print(sum(1,2,"123",nil,5,6));

用"#"来获取表的长度

Lua 复制代码
function sum(...)
    local ti={...};
    local count=#ti;
    for index=1,count,1 do
        print(index,ti[index]);
    end
end

print(sum(1,22,"123",nil,5,6));
相关推荐
新诺韦尔API2 分钟前
车架号查询接口对接全流程详解
大数据·开发语言·python·api
移幻漂流3 分钟前
Kotlin 完全取代 Java:一场渐进式的技术革命(技术、成本与综合评估)
java·开发语言·kotlin
2501_930707783 分钟前
使用C#代码在 Word 文档页面中添加装订线
开发语言·c#·word
WF_YL6 分钟前
极光推送(JPush)快速上手教程(Java 后端 + 全平台适配)
java·开发语言
一路往蓝-Anbo7 分钟前
【第48期】:嵌入式工程师的自我修养与进阶之路
开发语言·网络·stm32·单片机·嵌入式硬件
weixin_462446238 分钟前
在宝塔 Nginx 上安装与配置 lua-cjson 教程
nginx·junit·lua
郝学胜-神的一滴8 分钟前
深入理解网络分层模型:数据封包与解包全解析
linux·开发语言·网络·程序人生·算法
程序小馆9 分钟前
Qt cmake add_subdirectory 后无法使用子模块的资源(如图片、翻译文件)的解决方案
开发语言·qt
派大鑫wink10 分钟前
【Day42】SpringMVC 入门:DispatcherServlet 与请求映射
java·开发语言·mvc
uoKent17 分钟前
c++中的运算符重载
开发语言·c++