Lua中的函数是容许返回多个结果的。此时就须要使用多重赋值语句来接收函数的返回值。数组
s , e = string.find("hello lua users", "lua") --->在字符串中找到指定的字符串,返回匹配的起始字符和结尾字符的索引。 print(s,e) --->7,9
以Lua编写的函数一样能够返回多个结果,只须要在return关键字后列出全部的返回值便可。Lua会调整一个函数的返回值数量以适应不一样的调用状况。函数
1,若将函数调用做为一条单独语句,Lua会丢弃函数的全部返回值。lua
2,若将函数做为表达式的一部分来调用时,Lua只保留函数的第一个返回值。spa
3,只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素)时,才能得到它的全部返回值。一系列表达式包含4种状况:多重赋值、函数调用时传入的实参列表、table的构造式和return语句。code
首先,假设有如下这些函数定义:索引
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来补充缺失的值:string
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,若是一个函数调用不是一系列表达式的最后一个元素,那么将只产生一个值(保留第一个值返回):io
x,y = foo2(),20 -- x = "a" , y = 20 x,y = foo0(),20,30 --x = nil,y = 20,30被丢弃。
4,当一个函数调用做为另外一个函数调用的最后一个(或仅有的)实参时,第一个函数的全部返回值都将做为实参传入第二个函数。table
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