一方猪猴
走走停停,停停走走

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

posted on 2010-08-09 23:15  一步之遥  阅读(208)  评论(0)    收藏  举报