lua学习笔记二--函数

函数

多重返回值

Lua会调整一个函数的返回值个数以适应不同的调用情况。

  • 将函数调用作为一个单独语句使用时,Lua 会丢弃函数的所有返回值。
  • 将函数作为表达式的一部分来调用时,Lua 只保留函数的第一个返回值。
  • 只有当一个函数调用是一系列表达式中的最后一个元素(或仅有一个元素)时,才能获得它的所有返回值。

这分为四种情况:
1、 多重赋值
多重赋值中,若一个函数调用是最后(或者仅有的一个表达式),那么 Lua 会保留其尽可能多的返回值。如果一个函数没有返回值或者没有足够多的返回值,Lua 会用 nil 来补充缺失的值;如果一个函数返回值对于被赋值对象个数,Lua 会舍弃对于的返回值。

function foo()
    return "a","b"
end

x,y = foo() -- x="a", y="b"
x,y = 10, foo() -- x=10, y="a", "b"被舍弃
x,y,z = foo(), 10 -- x="a", y=10, z=nil
x,y,z = 10, foo() -- x="a", y="b", z=10

2、 函数调用时传入的实参列表
当一个函数调用作为另外一个函数调用的最后一个(或者仅有一个)实参时,第一个函数的所有返回值都将作为实参传入第二个函数

print(foo()) -- a   b
print(10, foo()) -- 10  a   b
print(foo(), 10) -- a   10
print(foo() .. "x") -- ax
print("x" .. foo()) -- xa

上例中的最后两行,当函数出现在一个表达式中时,Lua会将其返回值个数调整为1,所以 foo() 只返回了 “a”。

3、 table的构造式
table构造式可以完整的接收一个函数调用的所有返回结果,但是,这种行为只有当一个函数调用最为最后一个元素(或者仅有的一个元素)时才会发生,其他位置上的函数调用总是只产生一个返回值。

t = {foo()} -- t = {"a", "b"}
t = {10, foo()} -- t = {10, "a", "b"}
t = {10, foo(), 4} -- t = {10, "a", 4}

4、 return 语句

function foo2()
    return foo()
end
print(foo2()) -- a  b

如果将一个函数调用放在一对圆括号中,将强迫函数值返回一个结果

print((foo2())) -- a

变长参数 (variable number of arguments)

function add(...)
    local sum = 0
    for i,v in ipairs({...}) do -- ipairs{...}
        sum = sum + v
    end
    return sum
end

参数表中的 (...) 表示该函数可接受的不同数量的实参,当函数需要访问它的可变长实参时,{...} 将作为表达式来使用。

注意:在某些特殊情况下,可变长参数中可能会有 nil ,这样就不能通过 {…} 来访问所有的参数了
这种情况下,需要用到 select(index, ...) 函数。固定实参 index 为 n 时,函数返回可变参数中的第 n 个可变实参,当 index'#' 时,函数返回可变实参总个数。

-- 使用 select 遍历可变长实参
for i,select('#', ...) do
    local arg = select(i, ...)
    print(arg)
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫步旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值