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