深入理解Lua的闭包一:概念和应用

本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理。

闭包的概念

function foo(x) print(x) end

实质是等价于

foo = function (x) print(x) end

因此一个函数定义实质就是一条赋值语句,这条语句创建了一种类型为

值得一提的是,C语言里面函数不能在运行期被创建,因此不是第一类值,不过有时他们被称为第二类值,原因是他们可以通过函数指针实现某些特性,比如常常显现的回调函数的影子。

词法域是指一个函数可以嵌套在另一个函数中,内部的函数可以访问外部函数的变量。比如:

function f1(n) –函数参数n也是局部变量 local function f2()print(n) –引用外部函数的局部变量 end return f2endg1 = f1(2015)g1() — 打印出2015g2 = f1(2016)g2() — 打印出2016

注意这里的

function Create(n) local function foo1()print(n) end local function foo2()n = n + 10 end return foo1,foo2endf1,f2 = Create(2015)f1() — 打印2015f2()f1() — 打印2025f2()f1() — 打印2035

注意上面的例子中,闭包

闭包在创建之时其upvalue就已不在堆栈上的情况也有可能发生,这是因为内嵌函数能引用更外层外包函数的局部变量:function Test(n) local function foo()local function inner1()print(n)endlocal function inner2()n = n + 10endreturn inner1,inner2 end return fooendt = Test(2015)f1,f2 = t()f1()– 打印2015f2()f1()– 打印2025g1,g2 = t()g1()– 打印2025g2()g1()– 打印2035f1()– 打印2035

注意上面的执行的结果表明了闭包

闭包的应用 在许多场合中闭包都是一种很有价值的工具,主要有以下几个方面:

II)创建其他的函数的函数,即函数返回一个闭包。

do local oldOpen = io.open local accessOk = function(filename, mode) <权限访问检查>end io.open = function (filename, mode)if accessOk(filename, mode) thenreturn oldOpen(filename, mode)elsereturn nil, "access denied"end endend

经过重新定义后,原来不安全的版本保存到闭包的私有变量中,从而使得外部再也无法直接访问到原来的版本了。

V)实现迭代器。所谓迭代器就是一种可以遍历一种集合中所谓元素的机制。每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何进到下一个位置。闭包刚好适合这种场景。比如:

function values(t)local i = 0return function () i = i + 1 return t[i] endendt = {10, 20, 30}iter = values(t)while true dolocal element = iter()if element == nil then break endprint(element)end闭包的实现原理

。值得注意的是,在,从。由此可见,函数是编译期概念,是静态的,而闭包是运行期概念,是动态的。

作用域(生成期)规则下的嵌套函数给如何实现内存函数存储外部函数的局部变量是一个众所周知的难题(Thecombinationoflexicalscopingwithfirst-classfunctionscreatesawell-knowndifficultyforaccessingouterlocalvariables)。比如例子:

function add (x) return function (y) return x+yendendadd2 = add(2)print(add2(5))

保证了未决状态(未超过生命周期)的局部变量(变量离开作用域时(即超过变量生命周期),,这个打开的

一个函数有可能存取其更外层函数而非直接外层函数的局部变量。在这种情况下,当创建闭包时,这个局部变量可能不在栈中。

参考资料

(programming)#Lexical_scoping《Lua程序设计》

都成为命途中美丽的点缀,看天,看雪,安安静静,不言不语都是好风景。

深入理解Lua的闭包一:概念和应用

相关文章:

你感兴趣的文章:

标签云: