迭代器与 for 循环语句
for:idx 语句是一种迭代容器中元素的抽象机制。它依赖于 iterator “迭代器”来实现。 与 while 语句类似,for 语句也开启了一个 implicit block “隐式代码块”,也就可以使用 break 语句。
for 循环声明了迭代变量 - 它们的生命周期持续到循环体的结束。迭代变量的类型根据迭代器的返回值类型推断。
迭代器与过程类似,不过迭代器只能在 for 循环的上下文中调用。迭代器提供了一种遍历抽象类型的方法。 迭代器里的 yield 语句对于 for 循环的执行至关重要。当程序执行到 yield 语句时,数据会绑定 到 for 循环变量,同时控制权也移交到循环体并继续执行。迭代器的局部变量和执行状态在多次调用期间会自动保存。 例如:
# system 模块中存在如下定义
iterator items*(a: string): char {.inline.} =
var i = 0
while i < len(a):
yield a[i]
inc(i)
for ch in items("hello world"): # `ch` 是迭代器变量
echo ch
编译器会生成如下代码,就像是开发者写的一样:
var i = 0
while i < len(a):
var ch = a[i]
echo ch
inc(i)
如果迭代器的 yield 语句产生的是元组,那么可以有多个循环变量,个数等于元组的元素数。 第 i 次循环变量的类型就是元组第 i 个元素的类型。换句话说,循环上下文支持隐式元组拆包。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .