【小白学Lua】之Lua变长参数和unpack函数
一、简介
Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了。
二、Lua变长参数与unpack函数
Lua中支持可变参数,用 ... 表示。比如定义下面的这样一个函数:
local function func1(...)
end
当然它也支持在变长参数前面添加固定参数:
local function func1(var,...)
--dosomething
end
我们在使用变长参数的时候,首先需要将其获取,然后再使用,代码如下:
local function func(...)
local args = { ... } --这里的...和{}符号中间需要有空格号,否则会出错
print (#args)
end func(,,"string",,)
可以发现将变长参数用花括号进行打包以后,会得到一个table,之后就跟我们平时应用Lua没什么区别了。接着我们再来看看unpack函数,在Lua里面我们通常使用它来将数组形式的table拆开。这个函数有三个参数,第一个参数就是要拆的table,第二个参数是起始元素的下标,默认为1,第三个参数是结束元素的下标,默认为table的长度。函数原型如下:

举个栗子,看看如何使用,由于其特性,unpack还可以作为尾调用来提供多个返回值:
local info={,,,,,}
local a,b,c,d,e,f = unpack(info)
print(a,b,c,d,e,f)
--输出结果:1 2 3 4 5 6
local function func1 (t)
return unpack(t)
end
local v1,v2,v3,v4,v5,v6 = func1(info)
print(v1,v2,v3,v4,v5,v6)
需要注意的一点是,如果遇到数组下有nil,或者有字母key的时候,unpack将会返回nil,代码如下:
local info={,,,nil,,p=}
local a,b,c,d,e,f=unpack(info)
print(a,b,c,d,e,f)
输出结果: nil nil
三、小实例---拓展print函数
我们都知道在lua中可以用print函数进行打印操作,它本身也支持传递变长参数,不过美中不足的就是它不支持打印table中的内容,比如下面的这段代码:
print(,,,{,})
运行上面的这段代码,你通常会得到类似下面的这种输出:
table: 00FE9950
可以看到table中的元素没有被一一打印出来,因此我们可以利用lua的变长参数的功能来对print进行拓展,使他支持打印table中元素的内容:
local raw_print = print local function printTable(t)
if type(t) == "table" then
for _,v in pairs(t) do
if type(v) == "table" then
printTable(v)
else
raw_print(v)
end
end
end
end local function printExt(...)
local args = { ... }
for _,v in pairs(args) do
if type(v) == "table" then
printTable(v)
else
raw_print(v)
end
end
end rawset(_G,"print",printExt) print(,,,{,,{"abc"},nil})
简单说一下原理吧,先用局部变量将lua原始的print函数保存下来备用。然后分别定义printTable和printExt函数。printTable使用递归的方式对表中的元素进行遍历及打印。printExt会遍历外部传进来的多参数,然后根据类型进行分别处理。最后将全局环境中的原生print函数覆盖为我们自定义的printExt。运行效果如下:
abc
四、总结
在本篇博客中,马三同大家一起了解了Lua中变长参数和unpack函数的使用,并且通过拓展原生print函数的实例进行了练习。
如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!

作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/10054070.html
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!
【小白学Lua】之Lua变长参数和unpack函数的更多相关文章
- C++中的变长参数
新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...
- Lua 变长参数(variable number of arguments)
lua变长参数 function add ( ... ) for i, v in ipairs{...} do print(i, ' ', v) end end add(1, 2, 'sdf') lu ...
- (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__
作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...
- Scala 变长参数
如果Scala定义变长参数 def sum(i Int*), 那么调用sum时,可以直接输入sum(1,2,3,4,5) 但是不可以sum(1 to 5) 必须要将1 to 5 强制为seq sum( ...
- 《OOC》笔记(3)——C语言变长参数va_list的用法
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
- C++11变长参数模板
[C++11变长参数模板] C++03只有固定模板参数.C++11 加入新的表示法,允许任意个数.任意类别的模板参数,不必在定义时将参数的个数固定. 实参的个数也可以是 0,所以 tuple<& ...
- 【Unix环境高级编程】编写变长参数函数
文件的格式输入输出函数都支持变长参数.定义时,变长参数列表通过省略号'...'表示, 因此函数定义格式为: type 函数名(parm1, parm2,parmN,...); Unix的变长参数通过v ...
- java常量和变量的定义规则,变长参数的使用
首先是定义的一般规则,类名首字母全部大写,常量全部大写用下划线分隔,变量用驼峰形式.注意使用long赋值用L时不能写小写的L要写大写的,不然会和数字“1”傻傻分不清. 下面是举例: public cl ...
- Java基础12-工具类;变长参数;IO
作业解析 取出整数的16进制表示形式 \u00ff /** * int2hex * */ public static String int2hex(int i) { String str = &quo ...
随机推荐
- MyDAL - .UpdateAsync() 使用
索引: 目录索引 一.API 列表 1.UpdateAsync() 用于 单表 更新操作 二.API 单表-便捷 方法 举例-01 var pk1 = Guid.Parse("8f2cbb6 ...
- MySQL 关于性能的参数配置梳理
以下List是我们常见的MySQL参数配置,这个参数对提高实例的性能大有裨益. 其中 建议设置值,仅供参考,需要根据自己的业务场景和硬件资源仔细推敲. 参数 设置说明 建议设置值 lower_case ...
- cent os 7 与cent os 6 修改主机名称
centos6 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.零时修改用hostname your-name cnet ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 【深色模式】macOS Mojave+Visual Studio for Mac+FineUICore多图赏析!
全面开启深色模式,今早成功升级到 macOS Mojave,下面就来欣赏一下吧. 点击图片,查看大图 1. 下载 macOS Mojave 2. 安装成功,开启深色模式 3. 来一张桌面截图 4. 开 ...
- Spring Boot与缓存
---恢复内容开始--- JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheMana ...
- Python_if
if if c语言中的if语句格式如下: if (条件) { 结果} python的格式与其不同,定义了自己的格式,更加的简明: if 条件 : 结果 print(111) if 3 > 2: ...
- 【问题解决方案】pygame生成的窗口点右上角关闭按钮未响应问题的解决
pygame生成的窗口点右上角关闭按钮未响应问题的解决: 可在 sys.exit() 前面加上 pygame.quit()
- [转帖]Qemu 简述
Qemu 简述 记得KVM 就是 底层用的qemu https://www.cnblogs.com/bakari/p/7858029.html 本文首发于我的公众号 Linux云计算网络(id: cl ...
- Linux(Ubuntu)------常用命令汇总
文件 unzip -O cp936 file.zip unzip -O cp936 file.zip -d dir tar -zxvf file -C dir mv [-i ] file1 file2 ...