闭包

首先,明确闭包的概念。个人理解,一个闭包是一个封闭的数据和状态集合,闭包在创建的时候,可以捕获包外的数据,然后在包内会有一个数据副本,闭包内数据的生命周期随着闭包的结束而结束。在lua中,闭包是以匿名函数的形式出现的,同时,lua中闭包的赋值是传递的引用。

给出一个代码的说明实例:

function foo(n)local i = nreturn function()i = i + 1return iend
endx1 = foo(0)
x11 = x1  --  这里传递的是引用
x2 = foo(5)print(x1())
print(x1())
print(x11())
print(x2())
print(x2())

结果输出:

1
2
3
6
7

从上述代码中,可以看到foo函数返回一个闭包,这个闭包会捕获foo内部变量i的状态,一直到闭包的生命周期的结束。因此,闭包可以作为一个保存局部环境的方式。

迭代器

参考资料:https://www.lua.org/pil/7.1.html

假设我们想要借助闭包的方式遍历一个table,给出代码:

function list_iter(t)local i = 0local n = #treturn function() i = i + 1if i <= n thenreturn t[i]endend
endt = {10, 20, 30}iter = list_iter(t)
while true dolocal elem = iter()if elem == nil thenbreakendprint(elem)
end

上述的代码还有更简洁的一个写法,即借助for循环的方式,for循环相当于泛型的迭代,它把迭代器保持在自己的内部,返回每次迭代的元素。当返回nil时,终止迭代的流程。

function list_iter(t)local i = 0local n = #treturn function() i = i + 1if i <= n thenreturn t[i]endend
endt = {10, 20, 30}for elem in list_iter(t) doprint(elem)
end

但是,上述做法的缺陷在于每次新的循环,都要新建一个闭包,这会造成资源的浪费和消耗。

Lua笔记4 闭包、迭代器相关推荐

  1. 两个函数彻底理解Lua中的闭包

    本文通过两个函数彻底搞懂Lua中的闭包,相信看完这两个函数,应该能理解什么是Lua闭包.废话不多说,上 code: 1 --[[************************************ ...

  2. lua学习笔试之迭代器和通用for

    1.迭代器和闭包 迭代器是一个允许在集合元素的迭代.lua中用函数来表示迭代.迭代器需要记录一些状态.闭包提供了一些机制来记录状态. 闭包是可以访问一个或者多个来自于闭包环境的本地变量.变量用于在连续 ...

  3. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  4. Lua笔记-关于lua table的C API

    //Lua笔记-关于lua table的C API //转载请注明来自yuliying的CSDN博客. //Lua版本5.2 /*相关API: ====lua_createtable 原型: void ...

  5. lua笔记之local

    lua笔记之local 最近使用lua语言遇到一个小问题,这里要记录一下 lua 中使用 local 的变量,例如: function testLocal()print(a, b)a = 10086l ...

  6. lua学习笔记之闭包

    Lua中的函数是具有适当词法范围的一级值. lua作为一级值意味着函数与数字和字符串一样具有值,可以将函数存储在变量或者表中,将函数作为参数传递给其它函数,也可以作为结果返回函数. lua具有词法范围 ...

  7. lua中的闭包(closure或者匿名函数)的作用

    闭包和upvalue lua构建一个新的函数时, 会创建一个函数对象, 其中包含了函数本身的原型还有函数使用到的外部变量或者常量. 当这个新的函数处于某个函数内部, 我们将这个对象称之为闭包, 它所引 ...

  8. lua 函数调用1 -- 闭包详解和C调用

    这里, 简单的记录一下lua中闭包的知识和C闭包调用 前提知识: 在lua api小记2中已经分析了lua中值的结构, 是一个 TValue{value, tt}组合, 如果有疑问, 可以去看一下 一 ...

  9. Lua 函数、闭包、尾调用总结

    <lua 程序设计>在线阅读:http://book.luaer.cn/ 1.函数 函数有两种用途: 完成指定的任务,这种情况下函数作为调用语句使用: 计算并返回值,这种情况下函数作为赋值 ...

最新文章

  1. webpack url-loader limit 转换部分资源为base64格式 其余不转换
  2. WeakHahMap,HashMap和(垃圾回收)Gc
  3. 电脑快捷键横屏变竖屏,电脑显示器竖屏横屏来回切换怎么设置
  4. ActiveMq C#客户端 消息队列的使用(存和取)
  5. mysql脚本的制作_制作脚本实现mysql自动备份
  6. matlab dll没有头文件,matlab调用dll没有头文件怎么办
  7. Python 进阶 之 enumerate()函数
  8. HTML中文网页乱码问题
  9. tp5 前台 点击显示一个弹窗
  10. 【转】灵活运用 SQL SERVER FOR XML PATH
  11. 7-21 魔法优惠券 (25 分)
  12. idea 集成svn
  13. PC机上常用 EDA 软件
  14. 世界上最经典的25句话[转载]
  15. Qt读取界面的时间dateEdit,并将时间写入数据库中
  16. DelphiX 组件
  17. 学术大咖教你一个轻松在论文中画出漂亮插图的方法
  18. java之利用行列式展开法,计算行列式的值
  19. 6.18大促,看蚂蚁智能客服如何帮你快人一步
  20. linux amd显卡使用情况查看

热门文章

  1. 计算机科学与技术专业实训手册,计算机科学与技术专业实习计划
  2. 软件工程导论 09章面向对象方法学
  3. Python验证码识别初探(tesserocr库)
  4. Python中yield的作用:迭代生成器
  5. PyTorch中常用Module和Layer的学习笔记~
  6. Pytorch——搭建深度神经网络的基本流程
  7. [转]MyBatis传入多个参数的问题 - mingyue1818
  8. STL中的next_permutation
  9. 算法学习四:算法性能分析理论基础——函数增长与渐进分析
  10. MaxScale中间件部署数据库读写分离