Lua对可变参数的处理

简介: 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等技术内容,点击立即学习:


相关文章
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
815 0
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
域名解析 jenkins Java
Jenkins的安装与升级
Jenkins的安装与升级
455 0
|
存储 SQL 关系型数据库
【MYSQL高级】数据生成与插入脚本编写与使用
【MYSQL高级】数据生成与插入脚本编写与使用
289 1
|
JSON Go 数据格式
Golang 对象深拷贝的方案以及性能比较
文章探讨了在Go语言中实现对象深拷贝的三种方法:使用gob序列化、JSON序列化和定制化拷贝,并对比了它们在性能和代码复杂度方面的优劣,建议根据具体需求选择最适合的方法。
310 0
|
8月前
|
存储 人工智能 数据管理
媒体声音|专访阿里云数据库周文超博士:AI就绪的智能数据平台设计思路
在生成式AI的浪潮中,数据的重要性日益凸显。大模型在实际业务场景的落地过程中,必须有海量数据的支撑:经过训练、推理和分析等一系列复杂的数据处理过程,才能最终产生业务价值。事实上,大模型本身就是数据处理后的产物,以数据驱动的决策与创新需要通过更智能的平台解决数据多模处理、实时分析等问题,这正是以阿里云为代表的企业推动 “Data+AI”融合战略的核心动因。
|
存储 运维
使用Visual Studio分析.NET Dump
使用Visual Studio分析.NET Dump
183 0
|
Ubuntu 网络协议 Python
|
SQL 存储 NoSQL
数据库的类型(TP、AP、NoSQL、工具)(一)
数据库的类型(TP、AP、NoSQL、工具)(一)
2748 0
|
JavaScript 前端开发
【React+Antd】关于Upload导入XLSX时Uint8Array报错 XLSX.read的问题原因及解决方法
【React+Antd】关于Upload导入XLSX时Uint8Array报错 XLSX.read的问题原因及解决方法