Lua 变长参数以及 printf 实现

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

你可能感兴趣的:(Lua)