Lua 程序設計 函數02 多重返回值

        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
相關文章
相關標籤/搜索