Lua程序设计之深刻函数

先看一个函数:c++

function derivative(f,delta)ide

    delta = delta or1e-4函数

    return function(x)lua

        return (f(x+delta)-f(x))/deltaspa

    endit

end io

对特定的函数f调用derivative(f)将(近似地)返回其导数,例如function

c=derivative(math.sin)class

print(math.cos(10),c(10))  --c(10)这样的调用至关于derivative(math.sin)(10)匿名函数

这个例子最让我惊奇的是,10这个参数能够直接经过(10)的方式传进去里面嵌套的函数。


1. 闭合函数,closure,就是一个函数加上该函数所需访问的全部非局部的变量


2. 非局部的变量,就是在内部嵌套函数能够访问的位于其外部嵌套环境中的局部变量,即不是全局变量也不是局部变量。即上面例子中的delta或者下面例子中的i。

例子:

    Function newCounter()

        local i= 0 –非局部变量

        return function()

            i= i+1

        return i

    end 

c1 =newCounter()  -- not c1 = newCounter,

Print(c1())  --1  至关于 newCounter()() 

Print(c1())  --2  至关于 newCounter()()

    因为建立变量i的函数(newCounter)已经返回,因此以后的每次调用每次调用匿名函数时,i都应是已经超出了做用范围,但其实lua会以closure的概念来正确地处理这种状况。

    在这里,不由要问,这里的i是怎样保存起来的,是相似于c++中的局部静态变量吗?     

    这里有一个答案来自网上:对于闭合函数而言,属于它的非局部变量,并非在调用它的时候临时产生的,而是和它一块儿存在的。因此每次调用闭合函数,非局部变量的值都不会被重置。

 

3. 闭合函数的应用(重定义函数):沙盒


4. 因为闭合函数的特殊,咱们须要注意两种状况:a.非全局函数的调用顺序(须要前向声明吗?)function func () … end的写法只是一种语法糖,它至关于func = functionb.正确的尾调用。

相关文章
相关标签/搜索