lua闭包和尾调用

虽然工作已经基本上没有什么变动了,但是想起来面试的时候,总是屡试不爽的这么个问题。乘着这会儿空闲还是写下来,留作备用。也希望可以帮助到刚出来找Lua方面的工作的童鞋。
其实都是一些基础的东西,只是自己记性不好,还是写下来比较妥当。这样,忘记的时候,还可以回头看看。
1.lua闭包

--[[@
    lua闭包:
        从形式上来讲:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!
        闭包 = 函数 + 引用环境
    ]]
    function FUN1()
        local num = 10      --upvalue(非局部变量,非全局变量,和C和C++中的成员变量有点类似)


        function InFun1()
            print(num)
        end


        function InFun2()
            num = num + 10
            print(num,"...")
        end
        return InFun1, InFun2
    end


    local a, b = FUN1()
    a()
    b()
    a()


    运行结果:10
          20    ...
          20

总结:由于lua中可以内嵌函数,也就是函数内部声明的函数。称函数内部的函数为子函数(可以有多个子函数),子函数外部的函数为父函数,多个子函数之见可以共享父函数中声明的变量。子函数 + 父函数内部的环境就构成了闭包。有点类似于C++类中的成员函数可以访问和修改成员变量。具体引用实例,后面遇到再添加。

2.lua尾调用:

--[[@
    lua尾调用:
        尾调用是一种类似在函数结尾的goto调用
        当函数的最后一个动作是调用另外一个函数时,我们称这种调用为尾调用

        尾调用不需要使用栈空间,因此尾调用递归的层次可以无限制。
        例如下面调用不论n为何值不会导致栈溢出。
        function foo (n)
            if n > 0 then return foo(n - 1) end
        end
    ]]

需要注意的是:什么是尾调用?
格式:

在Lua中,只有“return <func> (<args>)”这样的调用形式才算是一条“尾调用”,Lua会在调用前对<func>及其参数求值,所以 它们可以是任意复杂的表达式。
return x[m].foo(x[n] + a*b,m+n)
Lua中“尾调用”的一大应用就是编写“状态机”。这种程序通常以一个函数来表示一个状态,改变状态就是goto到另一个特定的函数。

借鉴博客:闭包

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值