【笨木头Lua专栏】基础补充04:迭代器初探
今天学习的内容还蛮有意思的,让我兴奋了一下~
笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址: http://www.benmutou.com/archives/1714
文章来源:笨木头与游戏开发
1.迭代器
什么是迭代器?别傻了,我最讨厌的就是名词解释了,反正就是用来遍历集合的一种方式。
比方,我们最经常使用的pairs,例如以下代码:
- local t = {"fdsd", "445"};
- for k, v in pairs(t) do
- print("k=" .. k .. ", v=" .. v);
- end
这是一次遍历table的操作,然后打印出table的key值和value值。
输出结果例如以下:
[LUA-print] k=1, v=fdsd
[LUA-print] k=2, v=445
2.自己写一个迭代器
要想了解迭代器,那还是要自己写一个才行,迭代器没有什么奇妙的地方,它非常easy。如这样一个函数:
- function dieDaiQi(t)
- local i = 0;
- return function()
- i = i + 1;
- return t[i];
- end
- end
这函数故名思议,叫做迭代器,英文不好的也没关系,知道是这意思就好了,呵呵(小若:英文你个头啊!分明是拼音啊!)
有没有发现这dieDaiQi函数有点特别?没错,它就是之前的文章提到过的“闭合函数”,正是利用了闭合函数的特性来实现迭代功能的。
来看看怎样使用这个迭代器吧:
- local iter = dieDaiQi(t);
- while true do
- local value = iter();
- if value == nil then
- break;
- end
- print(value);
- end
由于每一次调用dieDaiQi函数,就会产生一个新的闭合函数,所以我们要用一个iter变量保存这个闭合函数,避免反复创建。
假设你对闭合函数已经非常生疏了,能够看看我之前的这篇文章:【笨木头Lua专栏】基础补充03:闭合函数、非全局函数与函数的尾调用
接着,仅仅要循环调用iter闭合函数就可以,由于闭合函数的特点,i变量是会一直添加的,所以每次调用iter函数,返回的都是下一个table元素。
终于输出结果例如以下:
[LUA-print] fdsd
[LUA-print] 445
3.更简洁的迭代器调用
刚刚调用迭代器的方式也太粗暴了,这么长一片代码,不太合理。
所以,我们又有了偷懒的方式——使用for循环调用迭代器。
直接看代码,刚刚的迭代器能够这么调用:
- local t = {"fdsd", "445"};
- for value in dieDaiQi(t) do
- print(value);
- end
这里大家可能会有一个疑问,每一次的循环,都会调用一次dieDaiQi函数,那不就会产生非常多个闭合函数?那i的值不就每次都是0?
答案是:不会的。
由于for循环仅仅会调用一次dieDaiQi函数,然后把它的返回值保存起来。
4.结束
这篇的介绍似乎是异常地简短,事实上不是的,还有下篇,由于我怕接下来要说的东西比較多,导致文章太长。
所以,还是分开来介绍吧,下一篇,我们来深入了解一下为什么for循环能够这么方便地处理迭代器。
【笨木头Lua专栏】基础补充04:迭代器初探的更多相关文章
- 【笨木头Lua专栏】基础补充05:迭代器番外篇
关于迭代器的内容, 另一点点,只是已经无关紧要了.应该算是一种扩展吧.就一起来开开眼界好了~ 笨木头花心贡献.哈?花心?不.是用心~ 转载请注明,原文地址: http://www.benmutou.c ...
- 【笨木头Lua专栏】基础补充02:函数的几个特别之处
没想到距离上一篇基础补充已经过了1年多了,近期准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~ 0.环境 我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE開始浮出水面了,它 ...
- 【笨木头Lua专栏】基础补充07:协同程序初探
哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...
- 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回
这次要介绍几个事实上非常easy,可是一定要小心的返回值规则. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明.原文地址: http://www.benmutou.com/archives/173 ...
- 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串
近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...
- 【本·伍德Lua专栏】补充的基础06:简单的错误处理
昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口! ) 今天来聊聊错误处理吧.只是毕竟这仅仅是前面的章节.书上的内容似乎有点一笔带过的味道. 没关系,简单更 ...
- [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求
原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...
随机推荐
- 在C#环境中动态调用IronPython脚本(二)
一.Python数据类型与C#数据类型的对应 Python中数据类型中的简单类型,例如int,float,string可以对应到C#环境中的int32,double,string,这些对应比较直观,P ...
- basename, dirname 在C语言中的使用
basename作用是得到特定的路径中的最后一个'/',后面的内容 如/usr/bin,得到的内容就是bin 如果/sdcard/miui_recovery/backup 得到的内容就是backup ...
- 【Web探索之旅】第三部分第二课:IP地址和域名
内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些 ...
- Codeforces Helpful Maths
Xenia the beginner mathematician is a third year student at elementary school. She is now learning t ...
- redmine 出口中国的乱码
pdf 这是redmine的bug.必须在个人账户更改将设立中国语文,足够的人才来解决. 顺便说一下,提示.以下更改文件的方法是无效的 /home/redmine/redmine-2.5.1/lib/ ...
- 解决linux看温度是报错No sensors found问题
今日因为同事的linuxserver频繁死机,其型号和配置与我的一致,故此与其对照了一下server的内存使用率.CPU使用率.温度等信息. 在对照温度信息的时候发现无法使用sensors进行温度查看 ...
- cassandra 服务启动流程
cassandra 服务启动流程 1. setup 1) CassandraDaemon ->main publicstaticvoidmain(String[]args) { insta ...
- 谈话节目APE系列:如何成为技术达人
作为一个程序猿,总有消退的前辈.或更年轻的同行.牛逼的人总是羡慕. 让我们搞自己痛苦的日子 BUG .头发很快结束了抓,人们扫两.修改一行代码.问题得以克服:例如,他们自己开发的十年,少付 10K , ...
- Android 布局管理器
为了更好地管理Android应用程序的用户界面组件,Android它提供了一个布局管理.通过使用布局管理,Android具有良好的平台无关的图形用户界面应用程序. 平时,推荐布局管理器来管理分布式组件 ...
- Java-如何去掉JFrame上的最大化最小化和关闭按钮(转)
在JDK1.4以前,我们只有一种方式来去掉窗口的标题栏,那就是直接使用JWindow,用JWindow来代替JFrame使用.但用过JWindow的人一定知道,JWindow在操作系统的任务栏是不可见 ...