Lua程序设计之深入函数
admin
2023-07-29 04:00:08
0

先看一个函数:

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


相关内容

热门资讯

热浪期间,法国家中死亡人数激增... 6月18日,在法国巴黎,人们在圣马丁运河水域消暑。新华社发上个月,欧洲遭遇了史上罕见的热浪袭击。根据...
日印各有所求,专家:双方的目标... 如何分析高市早苗此次访问中日印双方展现出的态度?两国关系可能面临哪些变量?凤凰卫视连线上海国际问题研...
二七区开展胡大白先进事迹专题宣... 7月1日,二七区邀请我校马克思主义学院党委副书记、工会主席韩树栋走进区委党校,开展胡大白董事长先进事...
台媒:谷立言与特朗普立场渐行渐... 前不久,台湾《中国时报》刊发社论指出,“美国在台协会”台北办事处处长谷立言对民进党“新两国论”几乎照...
中国共产党党员队伍稳步壮大 组... 党员10128.6万名 基层党组织543.1万个中国共产党党员队伍稳步壮大 组织体系日趋严密新华社北...
演上了!美议员当众举起手机:去... 据美国印度战略伙伴关系论坛(USISPF)近日发布的一段视频,美国共和党联邦参议员史蒂夫·戴恩斯在一...
15岁少年在家中和同学饮酒后裸... 早前报道:15岁少年家中和同学饮酒后身亡,全身赤裸,屋内有火烧痕迹大象新闻(2026年7月3日)端午...
3秒钟,差点毁了韩红基金会 图为韩红/图源:@韩红工作室韩红,最近有点麻烦。先是为冯小刚新片《抓特务》宣传,一句“走面儿”引发大...
聚焦四个主攻方向!重庆持续布局... ‍‍据《重庆日报》报道,7月2日上午,三峡实验室在两江新区揭牌。三峡实验室由重庆市政府与中国科学院联...
台“中选会”人事案再遭否决,蓝... 海峡导报综合报道 台“中选会委员”名额尚未达到规定最低人数,台民意机构3日针对台当局行政机构补提的3...