迭代器
编辑教程迭代器
让我们回到无聊的计数实例:
echo("Counting to ten: ")
for i in countup(1, 10):
echo($i)
可以写一个conutup过程支持这个循环吗?让我们试试
proc countup(a, b: int): int =
var res = a
while res <= b:
return res
inc(res)
然而,这不工作。问题是这个过程应该不仅return,而且需要返回和continue在一个迭代器完成之后。这个返回和继续称为一个yield语句。现在剩下的唯一要做的事情是用iterator替换proc关键字,这是我们的第一个迭代器:
iterator countup(a, b: int): int =
var res = a
while res <= b:
yield res
inc(res)
迭代器看起来与过程很像。但这存在几点很大的不同:
- 迭代器只能被循环调用。
- 迭代器不能包含return语句,过程不能包含yield语句。
- 迭代器没有隐含的result变量。
- 迭代器不支持递归。
- 迭代器不能提前声明,因为编译器必须能够内联一个迭代器(这个限制将会在未来版本的编译器中消失)。
然而,你也可以使用一个封闭的迭代器来获得一组不同的限制。迭代器可以有相同的名字和参数作为一个过程,基本上它们有自己的命名空间。因此它常见的做法是积累过程中相同名字的迭代器的结果,并将它们作为一个序列返回,例如strutils模块的划分。
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
选择支付方式:
立即支付
¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟