Lua设计与程序第6章

函数
函数调用如果变量只有一个参数且参数是字符串或者表时可以省略(),其他必须要加()

print "hello world"

函数的结构

function 函数名(参数列表)
    body:函数体
end


当调用函数的参数如果多余会被抛弃,不足则会用nil代替。

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

print(f())     --nil,nil
print(f(1))  -- 1,nil
print(f(1,2))  -- 1,2
print(f(1,2,3))  -- 1,2

函数的多返回值
s, e = string.find("hello lua users", "lua")
print(s,e)

返回多个结果
  return m,n
多重赋值中多返回值的特性
-- 注意 只有函数调用是表达式最后一个表达式才能返回多值结果,个数不够会用nil补充

function foo2() return "a","b"  end
x,y,z = 10,foo2()  --x=10,y="a",z = "b"
x,y,z = foo2()    -- x = a, y = b, z = nil
x,y = foo2(),10    -- x = a, y = 10, "b" 被抛弃


当一个函数的调用的结果是另外一个函数的唯一参数时,会接收所有返回值
print(foo2())
--如果它是不是唯一的实参,lua会把其返回值的个数调整为1,参数如果是固定的,lua则会把返回值的个数调整和参数一致
print(foo2(),1)         --a, 1
print(foo2() .. "x")    --ax

表构造器会完整的接收函数所有返回值的结果不会调整个数
t = {foo2()}  -- "a","b"
function foo1() return "a" end

--上述只有函数调用时是唯一或者是最后一个才有效,在其他位置上总是只返回一个
t = {foo2(),foo1(),1}
print(t[1],t[2],t[3])  -- a, a, 1

-- 在一个函数里return 另外一个函数的调用会返回所有值
function foo(i)
    if i == 1 then
        return foo1()
    else
        return foo2()
    end
end

-- 如果想强制返回一个结果 可以用一对圆括号
print((foo2()))

可变长参数 ...

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

print(add(1,2,3,4,5,6,7,8,9))
-- 利用这个特性可以实现跟踪对某一个特定的函数
function foo1(...)
    print("calling foo:", ...)
    return foo(...)
end

当可变长的参数是第二个参数,那么必然会先赋值给固定参数,将剩余的参数如果有 作为可变长的参数
function fwrite(fmt, ...)
    print( fmt)
    return io.write(string.format(fmt, ...))
end
fwrite(0,1,3,"a")
-- 遍历可变长参数可以用 {...},如果要判断它是否包含nil,可以用table.pack来处理
--table.pack将可变长参数变成一个数组
-- n代表可变长参数的个数

function nonils(...)
    local arg = table.pack(...)
    for  i = 1, arg.n do
        if arg[i] == nil  then
            return false
        end
    end
    return true
end

print(nonils(2,3,nil))
print(nonils(2,nil,2,4))
print(nonils(2,1,2,4))

另外一种方式是函数 select,第一个参数是数值,则输出可变长参数是该数值后的所有的参数
如果是# 则输出返回参数个数的总和
print(select(1, "a", "b", "c"))        -- a,b,c
print(select(2, "a", "b", "c"))        --b,c
print(select(3, "a", "b", "c"))        --c
print(select("#", "a", "b", "c"))      --3  

--!这里select函数只会返回第i个参数,参考多返回值的特性
function add(...)
    local s = 0
    for i = 1, select("#",...) do
        s = s+select(i,...)
    end
    return s
end
print(add(1,2,3))

table.unpack(t,i,n) t:数组, i:指定返回位置, n:返回的个数 返回值:长度
a,b,c =table.unpack{1,2,3}
print(a,b,c)  --1,2,3

尾调用
--尾调用是什么?尾调用(tail call)是指一个函数在执行的最后一步调用另一个函数。
--为什么要用尾调用:当一个函数在最后一步调用另一个函数时,Lua 的编译器可以优化掉当前函数的调用帧,直接使用被调用函数的调用帧,从而避免在调用栈上留下额外的信息。
function f(x)
    x = x+1;
    return g(x)
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值