• 迭代器和for语句

    迭代器和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循环上下文中的隐式元组解包。