Lua的函数除了一般函数有的特点之外,还有自己特有的一些属性。
1. 闭包
一个函数里嵌套其他的函数,那么嵌套的函数可以直接访问外层函数的局部变量,而不需要将变量传入函数里。
names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
function sortbygrade (names, grades)
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2]
end)
end
可以看到匿名函数function (n1, n2)直接用到了grades。
2. 局部函数
局部函数的定义有点像局部变量的定义,用到关键字 local,同一个chunk里面的局部函数可以互相访问。
local f = function (...)
...
end
但有一点特别的,在申明递归局部函数的时候
local fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end
fact(n-1)的时候会去查找全局函数里有没有fact,解决的方法是先把fact申明为local
local fact
fact = function()
3. 尾调用
其实就是函数返回值是另外一个函数
function f(x)
return g(x)
end
但是下面这种情况不是尾调用
function f (x)
g(x)
return
end
注:代码参考Programming in Lua
浙公网安备 33010602011771号