调用Lua函数时提供的实参数量可以与形参数量不同。Lua会自动调整实参的数量,以匹配参数表的要求。“若实参多余形参,则舍弃多余的实参;若实参不足,则多余的形参初始化为nil”。栗子:
function f(a, b) return a,b end
local a,b = f(3)
print(a,b) -- 3 nil
a,b = f(3,4)
print(a,b) -- 3 4
a,b = f(3,4,5)
print(a,b) -- 3 4
- 0x00 多重返回值(multiple results)
假设以下函数定义:
function foo0() end
function foo1() return "a" end
function foo2() return "a", "b" end
若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。
x,y,z = foo2(),20 -- a 20 nil
x,y,z = 20,foo2() -- 20 a b
只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素时),才能获得它的所有返回值。
- 0x01 多重赋值
若一个函数调用是最后(或仅有)的一个表达式,那么Lua会保留其尽可能多的返回值:
x,y = foo2() -- a b
如果一个函数没有返回值或没有足够多的返回值,那么Lua会用nil来补充缺失的值:
x,y = foo0() -- nil nil
x,y = foo1() -- a nil
如果一个函数调用不是最后一个,那么将只产生一个值:
x,y = foo2(),20 -- a 20
x,y = foo0(),20,30
- 0x02 函数调用时传入的实参列表
当一个函数调用作为另一个函数调用的最后一个(或仅有的)实参时,第一个函数的所有返回值都将作为实参传入第二个函数:
print(foo2()) -- a b
当foo2()出现在一个表达式中时,Lua会将其返回值数量调整为1:
print(foo2(), 1) -- a 1
print(foo2() .. "x") -- ax
- 0x03 table的构造式
函数调用作为最后一个元素时:
t = {foo0()}
print(t[1]) -- nil
t = {foo1()}
print(t[1]) -- a
t = {foo2()}
print(t[1],t[2]) -- a b
函数调用不是最后一个元素时:
t = {foo0(), foo2(), 4}
print(t[1], t[2], t[3]) -- nil a 4
- 0x04 return语句
function foo(i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
print(foo(0)) -- (无返回值)
print(foo(1)) -- a
print(foo(2)) -- a b
特别地,return语句后面的内容是不需要圆括号的,如果添加了圆括号会强制返回一个值,而无关被调用的函数有几个返回值。
function foo(i)
if i == 0 then return (foo0())
elseif i == 1 then return (foo1())
elseif i == 2 then return (foo2())
end
end
print(foo(0)) -- nil
print(foo(1)) -- a
print(foo(2)) -- a
- 0x05 unpack函数
定义:接受一个数组作为参数,并从下标1开始返回该数组的所有元素:
print(unpack{10, 20, 30}) -- 10 20 30
利用unpack对函数传入动态数量的参数:
f = string.find
a = {"hello", "ll"}
print(f(unpack(a))) -- 3 4