虽然工作已经基本上没有什么变动了,但是想起来面试的时候,总是屡试不爽的这么个问题。乘着这会儿空闲还是写下来,留作备用。也希望可以帮助到刚出来找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闭包