Lua中的闭包
来源:互联网 发布:流程优化小组 编辑:程序博客网 时间:2024/06/06 04:28
转自:http://www.jellythink.com/archives/498,请点击连接查看原文,尊重楼主大大版权。
------------------------------------------------------------------------------------------------------------------------------------------
九、Lua中的闭包
前言:
在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结。希望对大家学习Lua有帮助。
什么是闭包?
闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体。我们再来看一段代码:
function newCounter() local i = 0 return function () -- 匿名函数 i = i + 1 return i endendc1 = newCounter()print(c1()) print(c1())根据刚刚说的闭包的概念,结合上面的代码,来说说这个概念。闭包=函数+引用环境。
上述代码中的newCounter函数返回了一个函数,而这个返回的匿名函数就是闭包的组成部分中的函数;引用环境就是变量i所在的环境。
实际上,闭包只是在形式和表现上像函数,但实际上不是函数,我们都知道,函数就是一些可执行语句的组合体,这些代码语句在函数被定义后就确定了,并不会再执行时发生变化,所以函数只有一个实例。而闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例,就好比相同的类代码,可以创建不同的类实例一样。
在看别人的文章时,看到有这样的说法:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!这种说法其实就说明了闭包的一种表象,让我们从外在形式上,能更好的理解什么是闭包。至于深层次的闭包,我们接着继续。
再看闭包
看过我博客的朋友都清楚,我之前的博客都是写的关于C++的东西,对于学习C++的我,理解Lua的闭包时,确实存在一些“难度”。
首先,在Lua中,创建一个函数,就像定义一个普通类型值一样的,也就是我之前的博文中说的,Lua中的函数和和普通类型是没有区别的。Lua中的函数就是所谓的“第一类值”,它可以被存放在变量或数据结构中,可以当做参数传递给另一个函数,可以是一个函数的返回值,还可以在运行期间被创建。
Lua中的函数就是这样的一种“东西”,它很灵活。还记得我在《Lua中的函数》博文中提到的“非局部的变量”这个概念么?这是一个非常很重要的概念,它可以理解为不是在局部作用范围内定义的一个变量,同时,它又不是一个全局变量,也就是大家说的upvalue,由于有了这样的一种变量的存在,就成全了Lua中的闭包。
这种变量主要应用在嵌套函数和匿名函数里。我们都知道,可以在Lua的函数中再定义函数,也就是内嵌函数,内嵌函数可以访问外部函数已经创建的所有局部变量,而这些变量就被称为该内嵌函数的upvalue,upvalue实际指的是变量而不是值,这些变量可以在内部函数之间共享,比如以下代码:
function Fun1() local iVal = 10 -- upvalue function InnerFunc1() -- 内嵌函数 print(iVal) -- end function InnerFunc2() -- 内嵌函数 iVal = iVal + 10 end return InnerFunc1, InnerFunc2end-- 将函数赋值给变量,此时变量a绑定了函数InnerFunc1, b绑定了函数InnerFunc2local a, b = Fun1()-- 调用aa() -->10-- 调用bb() -->在b函数中修改了upvalue iVal-- 调用a打印修改后的upvaluea() -->20上述这段简单的代码,就验证了在内嵌函数中是共享upvalue的,就好比C++类中的成员函数可以访问和修改成员变量一样。
使用闭包
可以看到闭包是数据和行为的结合体,就好比C++中的类,这样就使得闭包具有较好的抽象能力,在某些场合下,我们需要记住某次调用完成以后数据的状态,就好比C++中的static类型的变量,每次调用完成以后,static类型的变量并不会被清除。使用闭包就可以很好的完成该功能,在下一篇博文中,我将会讲到使用闭包完成迭代器功能。
总结
闭包是一个非常很重要的概念,也好理解,也难理解,简单的说,闭包就是内嵌的函数加上它可以正确访问的upvalue。很多时候,我们明白了这个道理,却不会用这个东西,所以,我们需要阅读更多的代码,参加更多的项目,去积累更多的项目经验,来丰富自己的阅历,到时候,理解层次就会上去。
- Lua中的闭包
- Lua中的闭包
- Lua中的闭包
- lua中的闭包
- 学习 lua中的闭包
- Lua中的闭包理解
- lua中的upvalue 闭包
- Lua中的闭包小结
- 五、Lua中的闭包
- Lua中的闭包2
- [Lua]lua闭包
- Lua中的模块与包
- Lua中的模块与包
- 什么是 lua 闭包
- Lua闭包学习
- lua闭包简介
- lua之闭包
- Lua 闭包
- poj1258 最小生成树
- poj2991 Crane (线段树)
- curl各命令参数详解
- Vtk与opencv的冲突
- 吞吐量(Throughput)、QPS、并发数、响应时间(RT)
- Lua中的闭包
- Android获取当前城市名称
- 再探KVO
- java反射机制之Method invoke执行调用方法例子
- 【机器学习PAI实践三】雾霾成因分析
- Android API官方文档 存储选项
- 关于XML的解析的问题
- 2015蓝桥杯省赛模拟题C组
- Android菜单的使用