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 --还可以用下面的方式,获取变长参数的数据 local argf = ... local x, y, z = unpack(argf)
参数中的三个点(...)表示该函数可接受不同数量的实参。当这个函数被调用时,它的所有参数都会被收集到一起,这部分收集起来的实参称为这个函数的“变长参数”。
一个函数要访问他的变长参数时,仍需要用到3个点(...),只是此时的3个点作为一个表达式来使用的(如上)。表达式“...”的行为类似于一个具有多重返回值的函数,它返回的是当前函数的所有变长参数。
function fwrite(fmt, ...) --->3点之前有个固定的参数fmt。具有变长参数的函数同样也可以用拥有任意数量的固定参数,但是固定参数必须放在变长参数之前。 lua会将前面的实参赋予固定参数,而将余下的实参(如果有的话)视为变长参数。 return io.write(string.format(fmt, ...)) end fwrite() --->fmt = nil,没有变长参数。 fwrite("a") --->fmt = "a",没有变长参数。 fwrite("%d%d", 4, 5) ---->fmt = "%d%d",变长参数= 4 和 5
通常一个函数在遍历其变长参数时只需要使用表达式{...},这就像访问一个table一样,访问所有的变长参数。
函数select用于访问变长函数中有nil值的情况:
调用select时,必须传入一个固定的实参selector和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参;否则selector只能为字符串“#”,这样select会返回变长参数的总数。
for i =1 ,select("#", ...) do local arg = select(i, ...) --->得到第i个变长参数对应的可变实参。 <循环体> end