今天学习的内容还蛮有意思的,让我兴奋了一下~

笨木头花心贡献,哈?花心?不,是用心~

转载请注明,原文地址: http://www.benmutou.com/archives/1714

文章来源:笨木头与游戏开发

1.迭代器

什么是迭代器?别傻了,我最讨厌的就是名词解释了,反正就是用来遍历集合的一种方式。

比方,我们最经常使用的pairs,例如以下代码:

  1. local t = {"fdsd", "445"};
  2. for k, v in pairs(t) do
  3. print("k=" .. k .. ", v=" .. v);
  4. end

这是一次遍历table的操作,然后打印出table的key值和value值。

输出结果例如以下:

[LUA-print] k=1, v=fdsd
[LUA-print] k=2, v=445

2.自己写一个迭代器

要想了解迭代器,那还是要自己写一个才行,迭代器没有什么奇妙的地方,它非常easy。如这样一个函数:

  1. function dieDaiQi(t)
  2. local i = 0;
  3. return function()
  4. i = i + 1;
  5. return t[i];
  6. end
  7. end

函数故名思议,叫做迭代器,英文不好的也没关系,知道是这意思就好了,呵呵(小若:英文你个头啊!分明是拼音啊!)

有没有发现这dieDaiQi函数有点特别?没错,它就是之前的文章提到过的“闭合函数”,正是利用了闭合函数的特性来实现迭代功能的。

来看看怎样使用这个迭代器吧:

  1. local iter = dieDaiQi(t);
  2. while true do
  3. local value = iter();
  4. if value == nil then
  5. break;
  6. end
  7. print(value);
  8. end

由于每一次调用dieDaiQi函数,就会产生一个新的闭合函数,所以我们要用一个iter变量保存这个闭合函数,避免反复创建。

假设你对闭合函数已经非常生疏了,能够看看我之前的这篇文章:【笨木头Lua专栏】基础补充03:闭合函数、非全局函数与函数的尾调用

接着,仅仅要循环调用iter闭合函数就可以,由于闭合函数的特点,i变量是会一直添加的,所以每次调用iter函数,返回的都是下一个table元素。

终于输出结果例如以下:

[LUA-print] fdsd
[LUA-print] 445

3.更简洁的迭代器调用

刚刚调用迭代器的方式也太粗暴了,这么长一片代码,不太合理。

所以,我们又有了偷懒的方式——使用for循环调用迭代器。

直接看代码,刚刚的迭代器能够这么调用:

  1. local t = {"fdsd", "445"};
  2. for value in dieDaiQi(t) do
  3. print(value);
  4. end

这里大家可能会有一个疑问,每一次的循环,都会调用一次dieDaiQi函数,那不就会产生非常多个闭合函数?那i的值不就每次都是0?

答案是:不会的。

由于for循环仅仅会调用一次dieDaiQi函数,然后把它的返回值保存起来。

4.结束

这篇的介绍似乎是异常地简短,事实上不是的,还有下篇,由于我怕接下来要说的东西比較多,导致文章太长。

所以,还是分开来介绍吧,下一篇,我们来深入了解一下为什么for循环能够这么方便地处理迭代器。

【笨木头Lua专栏】基础补充04:迭代器初探的更多相关文章

  1. 【笨木头Lua专栏】基础补充05:迭代器番外篇

    关于迭代器的内容, 另一点点,只是已经无关紧要了.应该算是一种扩展吧.就一起来开开眼界好了~ 笨木头花心贡献.哈?花心?不.是用心~ 转载请注明,原文地址: http://www.benmutou.c ...

  2. 【笨木头Lua专栏】基础补充02:函数的几个特别之处

    没想到距离上一篇基础补充已经过了1年多了,近期准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~ 0.环境 我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE開始浮出水面了,它 ...

  3. 【笨木头Lua专栏】基础补充07:协同程序初探

    哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...

  4. 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回

    这次要介绍几个事实上非常easy,可是一定要小心的返回值规则. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明.原文地址: http://www.benmutou.com/archives/173 ...

  5. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  6. 【本·伍德Lua专栏】补充的基础06:简单的错误处理

    昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口! ) 今天来聊聊错误处理吧.只是毕竟这仅仅是前面的章节.书上的内容似乎有点一笔带过的味道. 没关系,简单更 ...

  7. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

    原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...

  8. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  9. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求

    原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...

随机推荐

  1. iOS 真机调试(最具体的步骤来解决历史,hmt精心打造)

    /*************************************************************1************************************* ...

  2. Objective-C代码块语法(block)使用

    和其它变量本质上相似的代码块.所不同的是,数据存储代码块是主体的函数. 使用的代码块被,你可以像打电话一样等标准功能,传入参数的数量,并获得返回值. 插入符号(^)语法标记块.我们熟悉的参数按照规约定 ...

  3. Solr在结果返回函数值

    如果你有一个服务,你的用户能够搜索不同的公司.用户输入一个简单的keyword,能够返回匹配keyword的公司,可是有一天,用户要求返回的公司列表中能够显示公司跟用户的距离,这是该怎么做呢? 1.如 ...

  4. chrome使用技巧(转)good

    阅读目录 写在前面 快速切换文件 在源代码中搜索 在源代码中快速跳转到指定的行 使用多个插入符进行选择 设备模式 设备传感仿真 格式化凌乱的js源码 颜色选择器 改变颜色格式 强制改变元素状态(方便查 ...

  5. hdu 5074 相邻的和最大dp

    http://acm.hdu.edu.cn/showproblem.php?pid=5074 给定一个序列 有些位数未知,给你全部两个数连续所得到的能量.问你怎么安排数字使得总能量最大 二维dp,dp ...

  6. asm 盘头损失,破坏

    BUG 14693394 – ORA-15196: INVALID ASM BLOCK HEADER [KFC.C:26076] [ENDIAN_KFBH] BUG 14758001 – ORA-15 ...

  7. PowerShell 批量导入/导出Active Directory

    PowerShell 批量导入/导出Active Directory         近期由于公司要求,须要导入20个供应商.20个客户到AD域中,刚開始手动添�了2个供应商,2个客户.可是感觉费时费 ...

  8. Codeforces Beta Round #3 A. Shortest path of the king

    标题效果: 鉴于国际棋盘两点,寻求同意的操作,是什么操作的最小数量,在操作过程中输出. 解题思路: 水题一个,见代码. 以下是代码: #include <set> #include < ...

  9. POJ 2155 Matrix (D区段树)

    http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1 ...

  10. (四)左右ng-app自己主动bootstrap相框

    博客之前 (三)ng-app的使用困惑和angularJS框架的自己主动载入 提出了使用ng-app指令的情况.之前认为出现第4和第5种情况非常奇怪,由于仅仅看到了现象,没有看到本质.JS错误.最直观 ...