【学习Lua】函数的多重返回值

调用Lua函数时提供的实参数量可以与形参数量不同。Lua会自动调整实参的数量,以匹配参数表的要求。“若实参多余形参,则舍弃多余的实参;若实参不足,则多余的形参初始化为nil”。栗子:

function f(a, b) return a,b end

local a,b = f(3)            
print(a,b)          -- 3    nil
a,b = f(3,4)
print(a,b)          -- 3    4
a,b = f(3,4,5)
print(a,b)          -- 3    4
  • 0x00 多重返回值(multiple results)
    假设以下函数定义:
function foo0() end
function foo1() return "a" end
function foo2() return "a", "b" end

若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。

x,y,z = foo2(),20   -- a    20  nil
x,y,z = 20,foo2()   -- 20   a   b

只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素时),才能获得它的所有返回值。

  • 0x01 多重赋值
    若一个函数调用是最后(或仅有)的一个表达式,那么Lua会保留其尽可能多的返回值:
x,y = foo2()    -- a    b

如果一个函数没有返回值或没有足够多的返回值,那么Lua会用nil来补充缺失的值:

x,y = foo0()    -- nil  nil
x,y = foo1()    -- a    nil

如果一个函数调用不是最后一个,那么将只产生一个值:

x,y = foo2(),20 -- a    20
x,y = foo0(),20,30
  • 0x02 函数调用时传入的实参列表
    当一个函数调用作为另一个函数调用的最后一个(或仅有的)实参时,第一个函数的所有返回值都将作为实参传入第二个函数:
print(foo2())   -- a    b

当foo2()出现在一个表达式中时,Lua会将其返回值数量调整为1:

print(foo2(), 1)        -- a    1
print(foo2() .. "x")    -- ax
  • 0x03 table的构造式
    函数调用作为最后一个元素时:
t = {foo0()}
print(t[1])         -- nil
t = {foo1()}
print(t[1])         -- a
t = {foo2()}
print(t[1],t[2])    -- a    b

函数调用不是最后一个元素时:

t = {foo0(), foo2(), 4}
print(t[1], t[2], t[3])     -- nil  a   4
  • 0x04 return语句
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(0))       -- (无返回值)
print(foo(1))       -- a
print(foo(2))       -- a    b

特别地,return语句后面的内容是不需要圆括号的,如果添加了圆括号会强制返回一个值,而无关被调用的函数有几个返回值。

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(0))       -- nil
print(foo(1))       -- a
print(foo(2))       -- a    
  • 0x05 unpack函数
    定义:接受一个数组作为参数,并从下标1开始返回该数组的所有元素:
print(unpack{10, 20, 30})       -- 10   20  30

利用unpack对函数传入动态数量的参数:

f = string.find
a = {"hello", "ll"}
print(f(unpack(a)))     -- 3    4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值