Lua 程序设计 函数02 多重返回值

        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

你可能感兴趣的:(函数,Lua程序设计,多重返回值)