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. 基于RBAC设计的通用权限管理框架

    RoadFlow拥有基于RBAC设计的通用权限管理框架.不仅可以基于角色组进行菜单授权,还可以根据组织架构中部门.岗位.人员等进行细分的权限管理分配. 如果一个人有重复菜单权限,则将自动合并. 系统资 ...

  2. FFmpeg命令详解

    命令格式 功能 FFmpeg命令是在ffmpeg.exe可执行文件环境下执行,ffmpeg.exe用于音视频的转码,加水印,去水印,视频剪切,提取音频,提取视频,码率控制等等功能. 最简单的命令 ff ...

  3. 使用Spring Boot,Spring Cloud和Docker实现微服务架构

    https://github.com/sqshq/PiggyMetrics     Microservice Architecture with Spring Boot, Spring Cloud a ...

  4. Android---------------Service的学习

    一.创建与启动Servcie的三个步骤 : 1. 创建一个类并继承Servcie 2.在配置文件中注册服务 3.通过Intent来启动服务 二.Service的两种启动方式 1.startServce ...

  5. 【文文殿下】浅析scanf源码

    本文仅做理性上的愉悦,无实际用途. scanf实际的调用 我们直接使用的scanf其实是这样写的 int __cdecl scanf ( const char *format, ... ) { va_ ...

  6. TP5使用Composer安装phpoffice/phpspreadsheet,导出Excel文件

    1.composer安装: composer require phpoffice/phpspreadsheet 2.点击导出按钮,触发控制器里面的方法 wdjzdc() 3. 在控制中引入 use P ...

  7. ZZNU 2076(退役学长最后的神功 zz题)

    题目链接:http://acm.zznu.edu.cn/problem.php?pid=2076 输入一个T表示有T个样例每组实例一个整数n(0〈n〈1000接下来输入2*n个数字,代表一个2*n的矩 ...

  8. Educational Codeforces Round 26 A B C题

    题目链接 A. Text Volume 题意:计算句子中,每个单词大写字母出现次数最多的那个的出现次数(混不混乱QAQ). 解题思路:注意getchar()就没啥了. #include<cstd ...

  9. Python大法之从火车余票查询到打造抢Supreme神器

    本文作者:i春秋作家——阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=9 ...

  10. css 三角图标

    .triangle-right{ display: inline-block; width: 0; height: 0; border-top: 6px solid transparent; bord ...