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. LeetCode145:Binary Tree Postorder Traversal

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  2. navigationController背景图,文字,事件定义

    //设置背景图片 [self.navigationController.navigationBar setBackgroundImage:imag forBarMetrics:UIBarMetrics ...

  3. js框操作-----Selenium快速入门(八)

    js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt),他们都是模态窗口.什么是模态窗口,大家可以自行百度一下,简单说就是弹出的窗口是在最顶端的,你 ...

  4. BitAdminCore框架更新日志20180531

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  5. lnmp下thinkphp 500错误指南

    先在php.ini打开报错,display_errors: on: 如果是open_basedir的问题,修改nginx的配置文件fastcgi.conf 将fastcgi_param PHP_ADM ...

  6. Redis入门教程(C#)

    Redis是什么? Redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 补充概念: 持久化:是将程序数据在持久状态和瞬时状态间转换的机制.通俗的 ...

  7. 第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()

    最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...

  8. s11 day 101 python Linux环境安装 与路飞项目支付功能

    from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = ...

  9. PHP中日期函数

    1,转化为时间戳函数:strtotime() 本函数接受一个包含美国英语日期格式的字符串并尝试将其解析为Unix时间戳,其值相对于now参数给出的时间,如果没有提供此参数则使用系统当前时间. < ...

  10. 不再需要ImageOle或DynamicGifCtl,.NET实现IM编辑控件

    多年前写过一篇文章<C# 实现IM聊天信息输入显示控件(1)-显示GIF动画图片>,主要是使用ActiveX控件实现RichTextBox插入gif动画图片,包括使用QQ的ImageOle ...