double = function(a, b, c)
a = a or1
b = b or2
c = c or3return a * 2, b * 2, c * 2end-- 多舍弃少补nil
x, y, z = double()
print(x, y, z)
a, b, c, d = double(10, 11, 12)
print(a, b, c, d)
m, n = double()
print(m, n)
-- 函数调用必须在表达式最后才能接收所有返回值
x, y, z = nil, nil, nil
x, y, z = double(), 10-- 输出 2 10 nilprint(x, y, z)
-- 输出 2 10print(double(), 10)
t = {double()}
-- 输出 3print(#t)
t = {double(), 10}
-- 输出 2print(#t)
functionfoo()return double()
endfunctionfoo2()return double(), 10end-- 输出 2 4 6print(foo())
-- 输出 2 10print(foo2())
-- 输出 2print((foo()))
t = {double()}
print(t)
print(table.unpack(t))
变长参数
使用 … 表示可变参数
固定参数要在可变参数前面
lua5.1 之前可直接把 … 当成数组处理,5.2 之后必须先手动转成数组
如果变长参数中有 nil 值,必须使用 select 来获取参数的个数;select 函数第一个参数传入 n 时会返回变长参数的第 n 个元素,传入 ‘#’ 则会返回变长参数的个数
add = function(...)
local sum = 0
local arg = {...}
for i, v in ipairs(arg) do
sum = sum + v
end
return sum
end
print(add(1, 2, 3, 5))
foo = function(...)
local n = select(2, ...)
local count = select('#', ...)
return n, count
end
print(foo(1, 2))
具名参数
lua 函数实参位置与形参位置要一一对应,函数不支持字典型的参数,如foo(x = 10, y = 10)是不合法的