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: 存储过程和函数的区别
923 0
|
JSON 前端开发 JavaScript
【面试题】JavaScript 中 try...catch 的使用技巧 ?
【面试题】JavaScript 中 try...catch 的使用技巧 ?
261 0
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
数据采集 Web App开发 安全
爬虫
该文介绍了爬虫的基础知识,包括爬虫的定义(通过编程模拟浏览器抓取网络数据)、价值(实际应用和就业需求)、法律地位(合法但有违法风险,分为善意和恶意爬虫)以及可能带来的风险(影响网站运营和触犯法律)。为避免问题,建议优化程序、审查抓取内容。爬虫类型包括通用、聚焦和增量式爬虫。文中还提到了反爬与反反爬策略,以及robots.txt协议作为网站数据爬取的君子协定。此外,讨论了HTTP协议(包括User-Agent和Connection)和HTTPS协议的安全性及加密方式。
307 1
|
存储 SQL 关系型数据库
【MYSQL高级】数据生成与插入脚本编写与使用
【MYSQL高级】数据生成与插入脚本编写与使用
312 1
|
JSON Go 数据格式
Golang 对象深拷贝的方案以及性能比较
文章探讨了在Go语言中实现对象深拷贝的三种方法:使用gob序列化、JSON序列化和定制化拷贝,并对比了它们在性能和代码复杂度方面的优劣,建议根据具体需求选择最适合的方法。
387 1
|
JavaScript 前端开发
JS try catch用法:异常处理
【10月更文挑战第12天】try/catch` 是 JavaScript 中非常重要的一个特性,它可以帮助我们更好地处理程序中的异常情况,提高程序的可靠性和稳定性。
547 56
|
10月前
|
存储 人工智能 数据管理
媒体声音|专访阿里云数据库周文超博士:AI就绪的智能数据平台设计思路
在生成式AI的浪潮中,数据的重要性日益凸显。大模型在实际业务场景的落地过程中,必须有海量数据的支撑:经过训练、推理和分析等一系列复杂的数据处理过程,才能最终产生业务价值。事实上,大模型本身就是数据处理后的产物,以数据驱动的决策与创新需要通过更智能的平台解决数据多模处理、实时分析等问题,这正是以阿里云为代表的企业推动 “Data+AI”融合战略的核心动因。
|
JavaScript 前端开发 开发者
|
JavaScript 前端开发
nodejs使用axios以formdata形式上传图片
nodejs使用axios以formdata形式上传图片