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到另一个特定的函数。

借鉴博客:lua闭包

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值