函数
多重返回值
Lua会调整一个函数的返回值个数以适应不同的调用情况。
- 将函数调用作为一个单独语句使用时,Lua 会丢弃函数的所有返回值。
- 将函数作为表达式的一部分来调用时,Lua 只保留函数的第一个返回值。
- 只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素)时,才能获得它的所有返回值。
这分为四种情况:
1、 多重赋值
多重赋值中,若一个函数调用是最后(或者仅有的一个表达式),那么 Lua
会保留其尽可能多的返回值。如果一个函数没有返回值或者没有足够多的返回值,Lua
会用 nil
来补充缺失的值;如果一个函数返回值对于被赋值对象个数,Lua
会舍弃对于的返回值。
function foo()
return "a","b"
end
x,y = foo() -- x="a", y="b"
x,y = 10, foo() -- x=10, y="a", "b"被舍弃
x,y,z = foo(), 10 -- x="a", y=10, z=nil
x,y,z = 10, foo() -- x="a", y="b", z=10
2、 函数调用时传入的实参列表
当一个函数调用作为另外一个函数调用的最后一个(或者仅有一个)实参时,第一个函数的所有返回值都将作为实参传入第二个函数
print(foo()) -- a b
print(10, foo()) -- 10 a b
print(foo(), 10) -- a 10
print(foo() .. "x") -- ax
print("x" .. foo()) -- xa
上例中的最后两行,当函数出现在一个表达式中时,Lua会将其返回值个数调整为1,所以 foo()
只返回了 “a”。
3、 table的构造式
table构造式可以完整的接收一个函数调用的所有返回结果,但是,这种行为只有当一个函数调用最为最后一个元素(或者仅有的一个元素)时才会发生,其他位置上的函数调用总是只产生一个返回值。
t = {foo()} -- t = {"a", "b"}
t = {10, foo()} -- t = {10, "a", "b"}
t = {10, foo(), 4} -- t = {10, "a", 4}
4、 return 语句
function foo2()
return foo()
end
print(foo2()) -- a b
如果将一个函数调用放在一对圆括号中,将强迫函数值返回一个结果
print((foo2())) -- a
变长参数 (variable number of arguments)
function add(...)
local sum = 0
for i,v in ipairs({...}) do -- ipairs{...}
sum = sum + v
end
return sum
end
参数表中的 (...)
表示该函数可接受的不同数量的实参,当函数需要访问它的可变长实参时,{...}
将作为表达式来使用。
注意:在某些特殊情况下,可变长参数中可能会有 nil ,这样就不能通过 {…} 来访问所有的参数了
这种情况下,需要用到 select(index, ...)
函数。固定实参 index
为 n 时,函数返回可变参数中的第 n 个可变实参,当 index
为 '#'
时,函数返回可变实参总个数。
-- 使用 select 遍历可变长实参
for i,select('#', ...) do
local arg = select(i, ...)
print(arg)
end