Lua 变长参数以及 printf 实现

Lua 变长参数以及 printf 实现

https://blog.csdn.net/Bob__yuan/article/details/97146735

Lua 变长参数

Lua 中的函数可以接受不同数量的实参。例如:在调用print时可以传入一个、两个或多个实参。形参中的三个点(…)表示该函数可接受不同数量的实参。当这个函数被调用时,它的所有参数都会被收集到一起,这部分收集起来的实参称为这个函数的“变长参数”。 一个函数要访问他的变长参数时,仍需要用到 “…”,只是此时的 “…” 是作为一个表达式来使用的,其行为类似于一个具有多重返回值的函数,它返回的是当前函数的所有变长参数。如下所示:

function add(...)
    local s = 0
    -- {...}表示一个由所有变长参数构成的数组, {}必须要有, ()可以不写
    for i, v in ipairs({...}) do
        s = s + v
    end
    return s
end
print(add(3, 4, 5, 6, 7))  ---> 25

function test(...)
    -- 把可变参数放在表类
    local args = { ... }
    print(#args)
end

print(test(1, 2, 3))       ---> 3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

有点类似 C++ 的变长参数模版,Lua 变长参数中的也可以与固定参数一起使用,比如经典的 printf 就是这么实现的(printf(const char *format, …);),Lua 中没有 printf,但是可以用 io.write 和变长参数来实现,如下所示:

printf = function(str, ...)
    return io.write(str:format(...))
end
printf("%s\n", "Hello World!")  ---> Hello World!

    1
    2
    3
    4

这是因为 string.format() 的参数也是可变参数,其原型为 string.format (formatstring, ···)。第一个参数为字符串格式,后面的参数可以任意多个,用于填充第一个参数中的格式控制符,最后返回完整的格式化后的字符串。
格式控制符以%开头,常用的有以下几种:

    %s - 接受一个字符串并按照给定的参数格式化该字符串
    %d - 接受一个数字并将其转化为有符号的整数格式
    %f - 接受一个数字并将其转化为浮点数格式(小数),默认保留6位小数,不足位用0填充
    %x - 接受一个数字并将其转化为小写的十六进制格式
    %X - 接受一个数字并将其转化为大写的十六进制格式

    str = string.format("字符串:%s, 整数:%d, 小数:%f, 十六进制数:%X", "abcd", 123, 0.1415926, 123)
    print(str) ---> 字符串:abcd, 整数:123, 小数:0.141593, 十六进制数:7B

————————————————
版权声明:本文为CSDN博主「Bob__yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Bob__yuan/article/details/97146735

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值