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

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

转载请注明,原文地址: 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函数:

  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:函数的几个特别之处

    [笨木头Lua专栏]基础补充02:函数的几个特别之处 笨木头  2014-08-14 21:45   Cocos2d-x Lua   阅读(4,507)   6条评论 没想到距离上一篇基础补充已经过了 ...

  3. (转载)【笨木头Lua专栏】基础补充01:巧说table的几种构造方式

    [笨木头Lua专栏]基础补充01:巧说table的几种构造方式 笨木头  2013-06-4 23:04   Cocos2d-x Lua   阅读(13,556)   13条评论 之前对于Lua的研究 ...

  4. 笨木头Lua专栏 函数的几个特别之处

    [笨木头Lua专栏]基础补充02: [木头Cocos2d-x 029]Lua篇(第04章):来点高难度的,获取Lua表结构数据 只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lu ...

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

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

  6. 【笨木头Lua专栏】基础补充01:巧说table的几种构造方式

    之前对于Lua的研究都是纸上谈兵,没有真正的项目练手,现在公司的项目基本上都是用Lua开发,是时候补充一下我那蹩脚的Lua知识了. 基础数据类型.表达式.循环结构什么的我就不说了,这么简单的东西说了也 ...

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

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混 ...

  8. (转载)【笨木头Lua专栏】基础补充18:Lua的模块编写与module函数

    很快就要开始介绍Lua里的"面向对象"了,在此之前,我们先来了解一下Lua的模块. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址:http://www.benmut ...

  9. (转载)【笨木头Lua专栏】基础补充07:协同程序初探

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混 ...

最新文章

  1. linux学习笔记十(Raid基本知识)
  2. spring jpa 流式_从响应式Spring Data存储库流式传输实时更新
  3. asp.net中,%#%,%=%和%%分别是什么意思,有什么区别
  4. .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一(转)
  5. 中国·哈尔滨国际友好城市冰雪汽车挑战赛开赛
  6. 新华三:竞奔不息,永立潮头
  7. Java生成随机数原理_java随机数生成的原理
  8. limesurvey php5.2,如何在Limesurvey Docker映像上安装php composer
  9. Mac系统Cornerstone安装和使用说明(最佳的SVN管理工具)
  10. 改造家里的开关为智能开关,保留原有开关控制,零火版,HomeKit篇(三)
  11. GEO数据挖掘(学习笔记)
  12. ArduPilot简介
  13. 湖南大学计算机专业推免生,湖南大学2018年招收推荐免试攻读研究生简章
  14. c++ opencv 身份证OCR识别:前期数据训练库准备(tesseractOCR)
  15. idea2020.2卡死在reading maven projects
  16. 线扫相机DALSA-Image Format(读图格式设置)
  17. 田忌赛马java lms_【044】:田忌赛马
  18. edgeR/limma/DESeq2差异基因分析→ggplot2作火山图→biomaRt转换ID并注释
  19. js文本框设置必填项_Jquery文本框小例(必填框)
  20. 删除linux后,修复windows的启动项:MBRFix工具

热门文章

  1. 深入理解JVM(1)
  2. 奥钻机器人_供应TB190-16机器人行走伺服行星齿轮减速机
  3. Map中可以作为Key的类型
  4. intra-mart使用笔记
  5. 126篇殿堂级深度学习论文分类整理,从入门到应用
  6. 【Python】基于Python获取链家小区房价信息及其POI数据
  7. AVR 定时器快速PWM模式使用
  8. 和客户沟通中能让你加分的英语细节
  9. icomoon字体图标的使用
  10. 线性代数(十六) : 矩阵的左零空间及四个基本子空间总结