【笨木头Lua专栏】基础补充05:迭代器番外篇
关于迭代器的内容, 另一点点,只是已经无关紧要了。应该算是一种扩展吧。就一起来开开眼界好了~
笨木头花心贡献。哈?花心?不。是用心~
转载请注明,原文地址: http://www.benmutou.com/archives/1721
文章来源:笨木头与游戏开发
1.避免创建闭合函数
我们之前一直在说的迭代器。都是要创建闭合函数。但,大家有没有想过,有了恒定状态和控制变量之后。是不是就不须要闭合函数了?
先来回想一下之前的迭代器函数:
- function dieDaiQi(t)
- local i = 0;
- return function(s, var)
- i = i + 1;
- if i > #t then
- return nil;
- end
- return i, t[i];
- end, 10, 0
- end
这是最后一次介绍的dieDaiQi函数,此时已经拥有了恒定状态和控制变量了。
不认为那个local i变量非常碍事吗?(小若:不认为)
仅仅要把它去掉,那就不存在闭合函数了。
我们把dieDaiQi函数改成这样子:
- function dieDaiQi(t)
- return function(s, var)
- var = var + 1;
- if var > #s then
- return nil;
- end
- return var, s[var];
- end, t, 0
- end
我们把恒定状态改为t。控制变量初值仍然是0。
调用dieDaiQi函数后。返回一个新的函数,这个函数已经不属于闭合函数了。
于是。依照上一篇内容的介绍(不记得的就回头看看吧),每次调用函数时,參数s就是我们须要的table,參数var从0開始,取代了local i变量。
怎么样?略微认为恒定状态和控制变量有点用处了吧?
2.利用恒定状态创造很多其它变量
刚刚所说的方法,是挺好的。但是。可以改变的变量仅仅有一个。假设这迭代器须要非常多变量呢?
除了使用闭合函数之外。另一个办法——将永恒变为善变。
- function dieDaiQi(t)
- return function(s, var)
- var = var + 1;
- if var > #s.list then
- return nil;
- end
- s.money = s.money * s.money;
- print("呵呵,钱。对我来说,就是一个数字而已:" .. s.money);
- return var, s.list[var];
- end, {list = t, money = 10}, 0
- end
留意一下,如今返回的恒定状态是一个table({list = t, money = 10})。
这个table在迭代过程中依然是恒定不变的。但。它里面的内容可就不一定了。
试试调用这个迭代器吧:
- local t = {"fdsd", "445", "9999"};
- for k, v in dieDaiQi(t) do
- print("k=" .. k .. ", v=" .. v);
- 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语句的。
我们来模拟一下曾经的做法:
- function dieDaiQiHistory(t, func)
- for i = 1, #t, 1 do
- func(i, t[i]);
- end
- end
(小若:我噗。为什么一開始不这么做?这样多简单啊喂!
)
咳咳。我们试试调用这个迭代器:
- local t = {"fdsd", "445", "9999"};
- dieDaiQiHistory(t, function(k, v)
- print("k=" .. k .. ", v=" .. v);
- end);
于是,在调用迭代器的时候,我们不须要使用for循环(尽管迭代器里面还是使用了)。
并且须要传递一个函数作为參数。用于回调。获得迭代的值。
因为我没有大量地使用者两种形式的迭代器,所以也没法去对照他们。
书上的作者是倾向于使用“现代”的迭代器。
并且我也发现,部分Lua的库函数。也是使用了这样的形式的迭代。或许是历史原因。又或许是这样的形式有其特有的使用场合。
4.结束
好了,关于迭代器,已经结束了。
感觉还不错,这是我第三遍翻这本书的前面章节了吧?果然还是得写写文章,才干理解地更透彻。印象也比較深刻。
越到后面就越难坚持了,加油吧…
(小若:所以说啊!为什么最后又用了省略号啊!用感叹号才显得比較有干劲啊…)
【笨木头Lua专栏】基础补充05:迭代器番外篇的更多相关文章
- 【笨木头Lua专栏】基础补充04:迭代器初探
今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...
- 【笨木头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 ...
- Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...
- 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...
- 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串
近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...
- 【本·伍德Lua专栏】补充的基础06:简单的错误处理
昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后-然后就没有看书了.(小若:借口!借口! ) 今天来聊聊错误处理吧.只是毕竟这仅仅是前面的章节.书上的内容似乎有点一笔带过的味道. 没关系,简单更 ...
- paper 9:SVM番外篇:支持向量机系列六:Duality —— 关于 dual 问题推导的一些补充理论。
在之前关于 support vector 的推导中,我们提到了 dual ,这里再来补充一点相关的知识.这套理论不仅适用于 SVM 的优化问题,而是对于所有带约束的优化问题都适用的,是优化理论中的一个 ...
随机推荐
- Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer
Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...
- 20165203 2017-2018-2 《Java程序设计》第一周学习总结
20165203 2017-2018-2<Java程序设计>第一周学习总结 教材学习内容总结 (一)Java的地位 Java是面向对象编程,并涉及网络.多线程等重要的基础知识,是一门很好的 ...
- OnClickListener接口
package com.example.wang.testapp2; import android.support.v7.app.AppCompatActivity; import android.o ...
- java8 - 多线程时间安全问题
import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeForma ...
- linux 101 hacks 5PS1
PS1——默认提示符 看完这一章,我心里若干个卧槽.. 如下所示, 可以通过修改 Linux 下的默认提示符,使其更加实用.在下面的例子中,默认的 PS1的值是“ \s-\v\$”,显示出了 shel ...
- LoadRunner中Action的迭代次数的设置和运行场景中设置
LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢? ...
- Python下opencv使用笔记(图像的平滑与滤波)
对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...
- poj2387- Til the Cows Come Home(最短路)
此为转载:http://blog.csdn.net/wangjian8006: 题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 解题思路: 模版题,这题要 ...
- 洛谷P4623 [COCI2012-2013#6] BUREK [模拟]
题目传送门 BUREK 格式难调,题面就不放了. 分析: 一道比较有思维难度的模拟题. 首先我们可以想到,对于一个三角形,可以画出一个最小矩形使得这个三角形被完全包围,并且这个矩形的边平行于坐标轴(图 ...
- ajax异步请求模式
什么是异步请求 我们知道,在同步请求模型中,浏览器是直接向服务器发送请求,并直接接收.处理服务器响应的数据的.这就导致了浏览器发送完一个请求后,就只能干等着服务器那边处理请求,响应请求,在这期间其它事 ...