迭代器和for语句
for 语句是一种迭代容器元素的抽象机制。 它依赖于 iterator这样做。就像 while 语句一样, for 语句打开一个 隐式块,这样它们就可以留下一个 break 语句。
for 循环声明迭代变量 - 它们的范围一直到循环体的末尾。 迭代变量的类型由迭代器的返回类型推断。
迭代器类似于一个过程,除了它可以在 for 循环的上下文中调用。 迭代器提供了一种指定抽象类型迭代的方法。 执行 for 循环的关键作用是在被调用的迭代器中播放 yield 语句。 每当达到 yield 语句时,数据就会被绑定到 for 循环变量,并且控制在 for 循环的主体中继续。 迭代器的局部变量和执行状态在调用之间自动保存。
示例:
- # 该定义存在于系统模块中
- 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` is an iteration variable
- echo ch
编译器生成代码就像程序员编写的那样:
- var i = 0
- while i < len(a):
- var ch = a[i]
- echo ch
- inc(i)
如果迭代器产生一个元组,那么迭代变量可以与元组中的组件一样多。 第i个迭代变量的类型是第i个组件的类型。 换句话说,支持for循环上下文中的隐式元组解包。