关于迭代器的内容, 另一点点,只是已经无关紧要了。应该算是一种扩展吧。就一起来开开眼界好了~

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

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

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

1.避免创建闭合函数

我们之前一直在说的迭代器。都是要创建闭合函数。但,大家有没有想过,有了恒定状态和控制变量之后。是不是就不须要闭合函数了?

先来回想一下之前的迭代器函数:

  1. function dieDaiQi(t)
  2. local i = 0;
  3. return function(s, var)
  4. i = i + 1;
  5. if i > #t then
  6. return nil;
  7. end
  8. return i, t[i];
  9. end, 10, 0
  10. end

这是最后一次介绍的dieDaiQi函数,此时已经拥有了恒定状态和控制变量了。

不认为那个local i变量非常碍事吗?(小若:不认为)

仅仅要把它去掉,那就不存在闭合函数了。

我们把dieDaiQi函数改成这样子:

  1. function dieDaiQi(t)
  2. return function(s, var)
  3. var = var + 1;
  4. if var > #s then
  5. return nil;
  6. end
  7. return var, s[var];
  8. end, t, 0
  9. end

我们把恒定状态改为t。控制变量初值仍然是0。

调用dieDaiQi函数后。返回一个新的函数,这个函数已经不属于闭合函数了。

于是。依照上一篇内容的介绍(不记得的就回头看看吧),每次调用函数时,參数s就是我们须要的table,參数var从0開始,取代了local i变量。

怎么样?略微认为恒定状态和控制变量有点用处了吧?

2.利用恒定状态创造很多其它变量

刚刚所说的方法,是挺好的。但是。可以改变的变量仅仅有一个。假设这迭代器须要非常多变量呢?

除了使用闭合函数之外。另一个办法——将永恒变为善变。

我们继续改动dieDaiQi

rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F1721&p=baidu&c=news&n=10&t=tpclicked3_hc&q=25013069_cpr&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=8&k1=%BA%DC%BE%C3%D2%D4%C7%B0&kdi1=8&k2=%BF%AA%BF%AA&kdi2=8&k3=%C4%A3%C4%E2&kdi3=8&k4=%D3%C0%BA%E3&kdi4=1&sid=283890b4d3c53afd&ch=0&tu=u1682305&jk=aea1c3b1cab1ff58&cf=29&fv=15&stid=9&urlid=0&luki=1&seller_id=1&di=128" target="_blank" mpid="2" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 136, 221); text-decoration: none;">函数

  1. function dieDaiQi(t)
  2. return function(s, var)
  3. var = var + 1;
  4. if var > #s.list then
  5. return nil;
  6. end
  7. s.money = s.money * s.money;
  8. print("呵呵,钱。对我来说,就是一个数字而已:" .. s.money);
  9. return var, s.list[var];
  10. end, {list = t, money = 10}, 0
  11. end

留意一下,如今返回的恒定状态是一个table({list = t, money = 10})。

这个table在迭代过程中依然是恒定不变的。但。它里面的内容可就不一定了。

试试调用这个迭代器吧:

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

输出结果例如以下:

[LUA-print] 呵呵,钱,对我来说,就是一个数字而已:100
[LUA-print] k=1, v=fdsd
[LUA-print] 呵呵,钱,对我来说。就是一个数字而已:10000
[LUA-print] k=2, v=445
[LUA-print] 呵呵。钱,对我来说。就是一个数字而已:100000000
[LUA-print] k=3, v=9999

怎么样?尽管每次迭代都是同一个table,但table的内容但是随时在变的。

就像某些人吖,嘴上说永远,行动却随时变。

(小若:是说你自己吗?)

3.不须要for循环的迭代器

如今调用迭代器都是要用到for循环的,事实上,在非常久非常久曾经…有一个…(小若:停!

我不是来听故事的)

好吧,事实上,在曾经,迭代器是不使用for语句的。

我们来模拟一下曾经的做法:

  1. function dieDaiQiHistory(t, func)
  2. for i = 1, #t, 1 do
  3. func(i, t[i]);
  4. end
  5. end

(小若:我噗。为什么一開始不这么做?这样多简单啊喂!

咳咳。我们试试调用这个迭代器:

  1. local t = {"fdsd", "445", "9999"};
  2. dieDaiQiHistory(t, function(k, v)
  3. print("k=" .. k .. ", v=" .. v);
  4. end);

于是,在调用迭代器的时候,我们不须要使用for循环(尽管迭代器里面还是使用了)。

并且须要传递一个函数作为參数。用于回调。获得迭代的值。

因为我没有大量地使用者两种形式的迭代器,所以也没法去对照他们。

书上的作者是倾向于使用“现代”的迭代器。

并且我也发现,部分Lua的库函数。也是使用了这样的形式的迭代。或许是历史原因。又或许是这样的形式有其特有的使用场合。

4.结束

好了,关于迭代器,已经结束了。

感觉还不错,这是我第三遍翻这本书的前面章节了吧?果然还是得写写文章,才干理解地更透彻。印象也比較深刻。

越到后面就越难坚持了,加油吧…

(小若:所以说啊!为什么最后又用了省略号啊!用感叹号才显得比較有干劲啊…)

【笨木头Lua专栏】基础补充05:迭代器番外篇的更多相关文章

  1. 【笨木头Lua专栏】基础补充04:迭代器初探

    今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...

  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. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  6. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

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

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

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

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

  9. paper 9:SVM番外篇:支持向量机系列六:Duality —— 关于 dual 问题推导的一些补充理论。

    在之前关于 support vector 的推导中,我们提到了 dual ,这里再来补充一点相关的知识.这套理论不仅适用于 SVM 的优化问题,而是对于所有带约束的优化问题都适用的,是优化理论中的一个 ...

随机推荐

  1. Http PipeLining

    Http PipeLining */--> div.org-src-container { font-size: 85%; font-family: monospace; } pre.src { ...

  2. c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历

    二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...

  3. sass问题

     用sass的minix定义一些代码片段,且可传参数 /** * @module 功能 * @description 生成全屏方法 * @method fullscreen * @version 1. ...

  4. 搜索入门之dfs--经典的迷宫问题解析

    今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. ...

  5. WordPress前台后台出现一片空白的原因以及解决办法

    WordPress前台后台出现空白的可能原因有以下: 这个问题,一般是在进行以下操作后出现的: 1.网站更换新主题2.网站安装或升级插件3.升级了Wordpress版本 其实问题的根源在于你的主题.插 ...

  6. HTML5练习2

    1.邮箱注册网页 主要代码: <!doctype html> <html> <meta charset="utf-8"> <title&g ...

  7. Signalr信息推送

    前序 距离上次写文章,差不多已经大半年了.感觉自己越来越懒了,即使有时候空闲下来了,也不想动.前面买了一系列的Python的书,基础的看了大概有四分之一,剩下的基本上还未动,晚上回去也只是吃饭看电影. ...

  8. 跟我一起学WPF(2):WPF控件基础

    WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...

  9. windows上springboot打war部署tomcat小记

    web项目,需要部署到云主机里去,现在windows里试一下. springboot项目,主要流程就只是打成war包后扔到tomcat里去,但是由于是springboot项目,有一些需要注意的地方,这 ...

  10. alpha冲刺阶段博客集合

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称: 那周余嘉熊掌将得队 作业目标:作业集合 团队信息: 队员学号 队员姓名 博客地址 备注 2216 ...