1、什么是闭包

闭包,又称闭合函数(closure)。通常,如果将一个函数写在另一个函数内,那么这个在内部的函数就可以访问到外部函数中的局部变量,这个特征就是词法域,有些资料上也叫它词法定界。闭包指的是一个内部函数,它可以访问一个或者多个外部函数的局部变量。那么可以看出,闭包就是由内部函数、外部函数,以及外部函数中创建的局部变量(upvalue)组成。lua的作者说,lua中只有closure,而不存在“函数”,因为函数本身就是一种特殊的closure,不过我们在平时为了不引起混淆,就采用术语“函数”来代替closure。
    function Counter()
local i=
return function()
i++
...
end
end
--这里就是闭包,Counter()就是外部函数,它的返回值就一个内部函数,
--这里的i也叫外部局部变量,就是lua中的upvalue
 

2、举个闭包栗子

function closureTest()
local a=
return function()
a=a+
return a
end
end ct1=closureTest()
print(ct1()) --
print(ct1()) -- ct2=closureTest()
print(ct2()) --

在这个例子中,lua会以closure的方式来处理这种情况,ct1和ct2是建立在同一个函数的两个不同闭包,每调用一次closureTest函数就会产生一个新的闭包 ,闭包中的upvalue各自独立,他们各自拥有局部变量a的实例。第一次打印ct1()时输出的是10,第二次打印ct1()时,由于是同一个闭包,重复调用ct1()时已经记住了上次调用后的值,因此输出20,而ct2()是另一个闭包,所以输出的是10。

 

3、迭代器与闭包

迭代器,指的就是一种可以遍历集合中每一个元素的机制,在lua中,我们用函数来描述迭代器。每调用一次这个迭代器函数,就会返回集合的下一个元素。迭代器需要在每次调用后保存一些状态,比如当前所遍历到的位置以及下一个位置等信息。根据我们上面讲的闭包的概念,闭包提供的机制可以很容易实现这个任务。下面写一个简单的迭代器:
function listTest (t)
local i =
local n = table.getn(t) --得到table的大小
return function ()
i = i +
if i <= n then return t[i] end
end
end

在这个迭代器例子中,每次调用listTest(),都能返回当前遍历到的位置的值,外部局部变量i保存的就是当前位置。

 

4、注意

闭包在我们的程序设计中是经常能用到的,在很多编程语言中都有闭包机制,我知道的C#、JS,以及python都有这样的机制,值得我们细细琢磨,用的好的话那就是奇淫技巧。此外,在lua中迭代器实现也分为多种情况,我们通常没必要自己动手去写一个迭代器,lua语言本身就提供了很多,我们用现成的即可。
 
如果内容有误,欢迎指正,谢谢

lua闭包与简易迭代器实现的更多相关文章

  1. 对 Lua闭包 知识点的学习的总结 ,在这里和大家分享一下,希望对大家有所帮助

    Lua闭包 --当一个函数内部嵌套另外一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征为词法定界.--闭包是由函数与其相关的引用环境组合而成的实体 闭包=函数+引用环境--不是在局部 ...

  2. LUA闭包概念演示

    闭包的一个重要场景,形成一个自治的环境, 让操作可以封闭运行, 即函数运行时有状态的,可以从闭包创建时候的环境独立开来. 例如下面的lua闭包, genFilter 其入参parmIn是 函数的内部变 ...

  3. 关于lua闭包导致引用无法释放内存泄露

    最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等 发现项目中两种存在内存泄露的情况 1.lua闭包的不当使用,对比包的引用要及时 释放. ...

  4. lua闭包实现迭代器遍历数组

    --实现访问数组的迭代器 function visit(t) return function() i = i + return t[i] end end --要访问的数组 ,,,} itor = vi ...

  5. Lua语法基础(3)--迭代器和泛型for

    迭代器和闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功 ...

  6. C# LUA 闭包

    许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果. //LUA------------------------------------------------ ...

  7. lua闭包浅析及项目应用

    lua函数与闭包: 原文地址:http://www.doc88.com/p-6681238341344.html 近日查阅关于lua的一些资料,找到了我能理解的关于lua函数与闭包的解析,我觉得这个程 ...

  8. lua闭包函数

    function createCountdownTimer(second) local ms = second * local function countDown() ms = ms - retur ...

  9. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

随机推荐

  1. 关于Java_Web连接Oracle数据库

    1.前提条件 1>装有Oracle数据库(因为连接的时候需要开启两项服务) 2>myeclipse或eclipse(支持WebProject的版本)开发环境,本机以myeclipse为例, ...

  2. 对Cookie和Session的理解

    本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~! Cookie和Session的产生背景: 在动态页面里面,每个变量都是有有效期的,所有的变量的最大生命周期就是一个脚本的周期( ...

  3. ASP.Net Core 2.2 MVC入门到基本使用系列 (三)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  4. asp.net—自定义轻量级ORM

    大型项目中ORM的使用已经是相当的频繁.目前.NET(C#)中比较流行的ORM框架也有很多,比如SqlSugar,Dapper,Entity Framework(EF)等. 相信很多有2年以上工作经验 ...

  5. mySql数据库 C#使用guid

    CHAR(36) 如果某列设置为CHAR(36),则MySQL官方的连接器会将其当成 GUID 类型.实际上,有时候 某个字段碰巧设为可CHAR(36), 但是我们的本意并非当它是GUID. varc ...

  6. Godot开发环境与学习资源

    记得第一次听到Godot的名字时还在深圳工作,刚刚接触Unity快一年,只是匆匆在Github上star了,就没有继续了.后面时不时翻开它的Git主页,然而一直没有下载过,每每想看看开源引擎都去看Or ...

  7. ES6躬行记(22)——Promise

    在JavaScript中,回调函数是处理异步编程的常用解决方案,但层层嵌套的回调金字塔(如下代码所示)一直受人诟病,因为不仅在视觉上更加混乱,而且在管理上也更为复杂. setTimeout(() =& ...

  8. python 实现获取电脑IP、主机名、Mac地址

    import socket import uuid # 获取主机名 hostname = socket.gethostname() #获取IP ip = socket.gethostbyname(ho ...

  9. 201621123018《Java程序设计》第4周学习报告

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.子类.父类.抽象类.abstract.super.object 1.2 尝试使用思维导图将这些关键词组织起来.注:思 ...

  10. ansj分词史上最详细教程

    最近的项目需要使用到分词技术.本着不重复造轮子的原则,使用了ansj_seg来进行分词.本文结合博主使用经过,教大家用最快的速度上手使用ansj分词. 1.给ansj来个硬广 项目的github地址: ...