迭代器和for语句

for 语句是一种迭代容器元素的抽象机制。 它依赖于 iterator这样做。就像 while 语句一样, for 语句打开一个 隐式块,这样它们就可以留下一个 break 语句。

for 循环声明迭代变量 - 它们的范围一直到循环体的末尾。 迭代变量的类型由迭代器的返回类型推断。

迭代器类似于一个过程,除了它可以在 for 循环的上下文中调用。 迭代器提供了一种指定抽象类型迭代的方法。 执行 for 循环的关键作用是在被调用的迭代器中播放 yield 语句。 每当达到 yield 语句时,数据就会被绑定到 for 循环变量,并且控制在 for 循环的主体中继续。 迭代器的局部变量和执行状态在调用之间自动保存。

示例:

  1. # 该定义存在于系统模块中
  2. iterator items*(a: string): char {.inline.} =
  3. var i = 0
  4. while i < len(a):
  5. yield a[i]
  6. inc(i)
  7.  
  8. for ch in items("hello world"): # `ch` is an iteration variable
  9. echo ch

编译器生成代码就像程序员编写的那样:

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

如果迭代器产生一个元组,那么迭代变量可以与元组中的组件一样多。 第i个迭代变量的类型是第i个组件的类型。 换句话说,支持for循环上下文中的隐式元组解包。