Lua中的函数是允许返回多个结果的。此时就需要使用多重赋值语句来接收函数的返回值。
s , e = string.find("hello lua users", "lua") --->在字符串中找到指定的字符串,返回匹配的起始字符和结尾字符的索引。 print(s,e) --->7,9
以Lua编写的函数同样可以返回多个结果,只需要在return关键字后列出所有的返回值即可。Lua会调整一个函数的返回值数量以适应不同的调用情况。
1,若将函数调用作为一条单独语句,Lua会丢弃函数的所有返回值。
2,若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。
3,只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素)时,才能获得它的所有返回值。一系列表达式包含4种情况:多重赋值、函数调用时传入的实参列表、table的构造式和return语句。
首先,假设有以下这些函数定义:
function foo0() end --无返回值。 function foo1() return 'a' end --返回1个结果。 function foo2() return "a" , "b" end --返回2个结果。
1,在多重赋值中,若一个函数调用是最后的(或仅有的)一个表达式,那么lua会保留其尽可能多的返回值,用于匹配赋值变量:
x,y = foo2() -- x = "a" y = "b" x= foo2() -- x = "a" "b"被丢弃 x,y,z = 10,foo2() -- x = 10, y = "a" , z = "b"
2,如果一个函数没有返回值或者没有返回足够多的返回值,那么Lua会用nil来补充缺失的值:
x,y = foo0() -- x = nil, y = nil x,y = foo1() -- x = "a" , y = nil x,y,z = foo2() -- x = "a" , y = "b" , z = nil
3,如果一个函数调用不是一系列表达式的最后一个元素,那么将只产生一个值(保留第一个值返回):
x,y = foo2(),20 -- x = "a" , y = 20 x,y = foo0(),20,30 --x = nil,y = 20,30被丢弃。
4,当一个函数调用作为另一个函数调用的最后一个(或仅有的)实参时,第一个函数的所有返回值都将作为实参传入第二个函数。
print(foo0()) ---> print(foo1()) --->a print(foo2()) --->a b print(foo2(),1) --->a 1 print函数可以接受不同数量的实参,这里foo2只返回第一个值。 print(foo2() .. "x") --->这里foo2()出现在一个表达式中,Lua会将其返回值数量调整为1,因此只输出foo2返回的第一个值。
5,table构造式可以完整地接收一个函数所调用的所有结果,不会有任何数量方面的调整:
t = {foo0()} ---t = {} 一个空的table t = {foo1()} ---t = {"a"} t = {foo2()} ---t = {"a","b"} 这种情况只有当一个函数调用作为table表中最后一个元素时,才会输出所有的字段,而在table其他位置上的函数调用总是产生一个结果。 t = {foo0(), foo2(), 4} --t = {nil, t[2] = "a" , t[3] = 4}
6,return f()这样的语句将返回f的所有返回值:
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(1)) --a print(foo(2)) --a b print(foo(0)) --无返回值 print(foo(3)) --无返回值 return 语句后面的内容是不需要圆括号的。
7,也可以将一个函数调用放入一对圆括号中,从而迫使它只返回一个结果:
print((foo0())) ---nil print((foo1())) ---a print((foo2())) ---a
8,特殊函数unpack:接受一个数组作为参数,并从下标1开始返回该数组的所有元素。
print(unpack{10,20,30}) --->10,20,30