【笨木头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 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...
随机推荐
- effective c++ 条款10 handle assignment to self operator =
非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... retur ...
- 两个文件中的配置项设置方法和C比较程序处理
在实际的软件开发项目.程序经常需要翻阅了一些资料可能会改变从外部,我们需要读出的信息到一个统一的文件(一般ini档),而此文件被称为个人资料. 考虑这样一个场景,程序须要与多个数据库打交道,要从配置文 ...
- LeanCloud获取最近会话列表和获取最后一条聊天记录
最近公司有项目需要集成IM聊天功能,领导要求用LeanCloud集成,搞不出来就要背包滚蛋啊,没办法只能硬着头皮搞了. 刚拿到官方提供的demo感觉:嗯,不错.图片语音啥的都有了,但尼玛这还不够啊,还 ...
- hdu3790最短路径问题
题意是这种,给你一个无向图, 每条边有距离和花费, 假设从第一个点到末点的最短路不唯一, 则输出最短路长度以及最少的花费. 否则输出长度和花费即可. 用传说中的链式向前星优化了一下边的存储, 写了个s ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...
- CSDN Androidclient生产 导航帖
弄个导航棒.的相关知识汇总. CSDN Android的client的效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzk ...
- OC本学习笔记Foundation框架NSString与NSMutableString
一.NSString与NSMutableString 相信大家对NSString类都不陌生.它是OC中提供的字符串类.它的对象中的字符串都是不可变的,而它的子类NSMutable ...
- html标和下标应用
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 世界杯推动彩票APP爆发,谁将会笑到最后?
巴西世界杯的火爆上演不只给球迷们带来了一场华丽的足球盛宴,对网络彩票行业而言,这也是一次千载难逢的商机. 只是,并不是全部玩家都能攫取理想的商业利益,网络彩票的角逐宛如世界杯的比赛一样,有人晋 ...
- 具体说明 Flume介绍、安装和配置
社论: 本文总结"Hadoop生态系统"中的当中一员--Apache Flume 写在前面二: 所用软件说明: 一.什么是Apache Flume 官网:Flume is a di ...