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
有点类似 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!
这是因为 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