lua学习笔记二--函数

来源:互联网 发布:什么是挂机软件 编辑:程序博客网 时间:2024/05/20 22:26

函数

多重返回值

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

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

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

function foo()    return "a","b"endx,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=nilx,y,z = 10, foo() -- x="a", y="b", z=10

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

print(foo()) -- a   bprint(10, foo()) -- 10  a   bprint(foo(), 10) -- a   10print(foo() .. "x") -- axprint("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()endprint(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 sumend

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

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

-- 使用 select 遍历可变长实参for i,select('#', ...) do    local arg = select(i, ...)    print(arg)end
0 0
原创粉丝点击