Lua程序设计之深入函数-创新互联

先看一个函数:

成都创新互联公司是一家专注于成都网站设计、成都做网站与策划设计,西区网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:西区等地区。西区做网站价格咨询:13518219792

function derivative(f,delta)

    delta = delta or1e-4

    return function(x)

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

    end

end

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

c=derivative(math.sin)

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 = function。b.正确的尾调用。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文题目:Lua程序设计之深入函数-创新互联
当前地址:http://scyanting.com/article/jgjge.html