Lua对可变参数的处理

一、select处理

-- 返回可变参数的部分参数,从第n个位置开始,如果n超过了实际元素的个数,则没有任何打印
select(n, ...)
-- 返回可变参数元素的个数
select("#", ...)

代码示例1

function test(...)
    print("当前table中的元素个数为:", select("#", ...))
    print(select(1, ...))
    print(select(2, ...))
    print(select(3, ...))
    print(select(4, ...))
    print(select(5, ...))
    print(select(10, ...))
end

test(1, 2, 3, true, "lwang")

运行结果
在这里插入图片描述
代码示例2:求若干数据的和

function add(...)
    local sum = 0
    local count = select("#", ...)
    print("当前table中的元素个数为:", count)
    for i=1, count do
        sum = sum + select(i, ...)
    end
    print("sum = ", sum)
end

add(1, 2, 3, 4, 5)

运行结果
在这里插入图片描述

二、pack处理

table.pack(…).n 原理是将可变参数打包成一个table,且会在最后多出一个n键,其对应的值就是table元素的个数

-- pack 处理可变参数
-- 
function add (...)

    local count = table.pack(...).n
    print("当前参数的个数为: ", count) 

    -- 将table保存在tmp中
    tmp = table.pack(...);
    sum = 0

    -- 版本1:遍历table,求和
    for k, v in pairs(tmp) do
        if k ~= "n" then
            sum = sum + v
        end
        -- print(k, v)
    end
    
    -- 版本2:遍历table,求和
    -- for i=1, count do
    --     if tmp[i] ~= nil then
    --         sum = sum + tmp[i]
    --     end
    -- end
    return sum
end

print("sum = ", add(1, 2, 3, 4, 5, nil, 10, nil, nil)) 

运行结果

在这里插入图片描述

2.2 unpack

作用:将table解成可变参数
语法:

-- i 是起始位置  j 是结束位置
table.unpack(list, i, j)

规则:

  • 如果 i 和 j 都不传,默认解出全部参数
  • 如果只传一个参数i,表示解出从i位置开始的全部参数

代码示例


function func()
    return table.pack(1, 2, 3, 4, 5)
end


print(func)

print(table.unpack(func()))
print(table.unpack(func(), 4))
print(table.unpack(func(), 2, 4))

print("===============")

tmp = func()
a, b, c, d, e = table.unpack(tmp)
print(a, b, c, d, e)

运行结果
在这里插入图片描述

三、补充

获取参数个数的第三种方法,本质还是可变参转成table

function func2(...)
    tmp = {...}
    local count = #tmp;
    print("参数个数为:", count)

    for k, v in pairs(tmp) do
        print(k, v)
    end
end


func2(1, 3, 4, 7, 8, nil, "lwang")

运行结果
在这里插入图片描述

推荐一个零声学院免费教程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值