参数自适应
调用函数时,如果参数数量不足,则会将传入的前几个参数赋给前几个形参,剩下的补nil;
如果过多则丢弃后面多余的参数
多重赋值
函数可以返回多个值,用逗号隔开
注意:当函数调用是一系列表达式中的最后一个时,才会返回多值,否则只返回第一个返回值
function foo0() end function foo2() return "a", "b" end x, y = foo2(), 20 --> x = "a", y = 20 x, y = foo0(), 20, 30 --> x = nil, y = 20
多重赋值返回的值可以作为函数实参、表构造器,规则依然同上“参数自定义”所述
可变长参数
用
... 表示function add(a, ...) for _, v in ipairs{...} do a = a + v end return a end
table.pack(...) 将可变长参数原样返回,同时在”n”字段中保存了参数个数local arg = table.pack(...); for i = 1, arg.n do -- do something to arg[i] end
select(selector, ...) 当selector为整数时,返回第n个参数以后的所有参数;为’#”时则返回参数个数table.unpack(list) 将列表展开为一组值,可以作为参数给另一个函数用也可以控制返回元素的范围
print(table.unpack({"Mon", "Tue", "Wed", "Thu"}, 2, 3)) --> Tue, Wed
尾调用优化
尾调用:一个函数的最后一个语句是函数调用
Lua语言解释器对该特性进行优化,即不会在原函数的栈帧基础上再加一个栈帧,而是直接将尾调用函数的返回地址设为「原函数的返回地址」,所以尾调用可以无限调用。
Lua的尾调用必须形如
(return) func(args) 将返回值限制为一个的调用才算尾调用,其他的不算,例如:
-- 在调用g(x)后,必须丢弃g返回的结果,依然不算尾调用 function f(x) g(x) end return x or g(x) return (g(x))