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