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
相关文章
相关标签/搜索