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