关于迭代器的内容,还有一点点,不过已经无关紧要了,应该算是一种扩展吧,就一起来开开眼界好了~
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.利用恒定状态创造更多变量
刚刚所说的方法,是挺好的,但是,能够改变的变量只有一个,如果这迭代器需要很多变量呢?
除了使用闭合函数之外,还有一个办法——将永恒变为善变。
我们继续修改dieDaiQi函数:
复制代码 代码如下:
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,迭代器
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 郑秀文.2024-Best.Concert.Live【华纳】【FLAC分轨】
- 《Pax Dei》配置要求一览
- 《过山车之心2》存档位置介绍
- 《三国志8 REMAKE》评测:自定义的三国演义
- 群星《少年白马醉春风 网剧OST原声专辑》[320K/MP3][117.05MB]
- 群星《少年白马醉春风 网剧OST原声专辑》[FLAC/分轨][621.04MB]
- 《魏佳艺5CD合集》[WAV分轨][3.8G]
- CSGO职业选手donk怎么样 2024最新donk个人资料介绍
- CSGO职业选手NiKo怎么样 2024最新Niko个人资料介绍
- 剑网3丝路风语PVE焚影怎么打 丝路风语PVE焚影圣诀手法配装攻略
- [老虎魚古典名盘]心碎SACD浪漫小提琴之声[DSF]
- Queen(皇后乐队)《GreatestHitsII》[SACD-DSF]
- 伤感绝唱《凄凉的爱》黑胶3CD[WAV+CUE]
- 老外盛赞《剑星》新战衣:还是韩厂了解玩家胃口!
- 玩家认为不用纠结游玩方式:享受才是第一 你同意吗?