迭代器与 for 循环语句

for:idx 语句是一种迭代容器中元素的抽象机制。它依赖于 iterator “迭代器”来实现。 与 while 语句类似,for 语句也开启了一个 implicit block “隐式代码块”,也就可以使用 break 语句。

for 循环声明了迭代变量 - 它们的生命周期持续到循环体的结束。迭代变量的类型根据迭代器的返回值类型推断。

迭代器与过程类似,不过迭代器只能在 for 循环的上下文中调用。迭代器提供了一种遍历抽象类型的方法。 迭代器里的 yield 语句对于 for 循环的执行至关重要。当程序执行到 yield 语句时,数据会绑定 到 for 循环变量,同时控制权也移交到循环体并继续执行。迭代器的局部变量和执行状态在多次调用期间会自动保存。 例如:

  1. # system 模块中存在如下定义
  2. iterator items*(a: string): char {.inline.} =
  3. var i = 0
  4. while i < len(a):
  5. yield a[i]
  6. inc(i)
  7. for ch in items("hello world"): # `ch` 是迭代器变量
  8. echo ch

编译器会生成如下代码,就像是开发者写的一样:

  1. var i = 0
  2. while i < len(a):
  3. var ch = a[i]
  4. echo ch
  5. inc(i)

如果迭代器的 yield 语句产生的是元组,那么可以有多个循环变量,个数等于元组的元素数。 第 i 次循环变量的类型就是元组第 i 个元素的类型。换句话说,循环上下文支持隐式元组拆包。