2.24. 迭代器

迭代器是可以在不知道序列实现细节的情况下遍历序列的对象。

Iterator 类型的定义如下:

iterator_type ::= iterator < type >

iterator<int>           // 迭代 Integer
iterator<const Foo&>    // 通过引用迭代 Foo

可以移动迭代器,但不能复制或克隆迭代器。

迭代器可以通过 each 函数从范围、静态数组或动态数组中创建。 each 函数是不安全的,因为迭代器没有捕获它的参数:

unsafe {
    var it <- each ( [1,2,3,4] )
}

遍历迭代器最直接的方法是使用 for 循环:

for ( x in it ) {             // 迭代 'it' 的内容
    print("x = {x}\n")
}

对于引用迭代器, for 循环将提供一个引用变量:

var t = fixed_array(1,2,3,4)
for ( x in t ) {        // x  int&
    x ++                // 增加 t 内的值
}

迭代器可以从 lambda (参见 Lambda) 或生成器 (参见 Generator) 创建。

在迭代器上调用 delete 会让它序列出来并释放它的内存:

var it <- each_enum(Numbers one)
delete it                           // 安全删除

var it <- each_enum(Numbers one)
for ( x in it ) {
    print("x = {x}\n")
}
delete it                           // 删除 Sequenced Out 迭代器始终是安全的

循环和迭代函数会自动执行此作。

2.24.1. 内置迭代器

表键和值迭代器可以通过 keysvalues 函数获得:

var tab <- { "one"=>1, "two"=>2 }
for ( k,v in keys(tab),values(tab) ) {  // keys(tab)  iterator<string>
    print("{k} => {v}\n")               // values(tab)  iterator<int&>
}

可以通过 each 函数迭代字符串的每个字符:

unsafe {
    for ( ch in each("hello,world!") ) {   // string iterator  iterator<int>
        print("ch = {ch}\n")
    }
}

可以通过 each_enum 函数迭代枚举的每个元素:

enum Numbers {
    one
    two
    ten = 10
}

for ( x in each_enum(Numbers.one) ) {       // argument 是所述枚举中的任何值
    print("x = {x}\n")
}

2.24.2. 内置迭代函数

empty 函数检查迭代器是 null 还是已经排序出去:

unsafe {
    var it <- each ( fixed_array(1,2,3,4) )
    for ( x in it ) {
        print("x = {x}\n")
    }
    verify(empty(it))           // iterator 被排序出来
}

更复杂的迭代模式可能需要 next 函数:

var x : int
while ( next(it,x) ) {       // 这在语义上等同于`for x in it`
    print("x = {x}\n")
}

Next 只能对可复制类型进行作。

2.24.3. 低级内置迭代函数

_builtin_iterator_first, _builtin_iterator_next, 和 _builtin_iterator_close 处理迭代器的常规生命周期。 可以使用这些作显式编写 for 循环的语义等效项:

var it <- each(range(0,10))
var i : int
var pi : void?
unsafe {
    pi = reinterpret<void?> ( addr(i) )
}
if ( _builtin_iterator_first(it,pi) ) {
    print("i = {i}\n")
    while ( _builtin_iterator_next(it,pi) ) {
        print("i = {i}\n")
    }
    _builtin_iterator_close(it,pi)
}

``_builtin_iterator_iterate``是一个功能来统治它们。它的作用类似于上述所有 3 个功能。 在非空迭代器上,它以 first 开始,然后继续调用 next,直到序列用完。 一旦迭代器被排序出来,它就会调用 close:

var it <- each(range(0,10))
var i : int
var pi : void?
unsafe {
    pi = reinterpret<void?> ( addr(i) )
}
while ( _builtin_iterator_iterate(it,pi) ) {     // 这相当于上面的示例
    print("i = {i}\n")
}

2.24.4. 下一页 实现细节

函数 next 的实现如下:

def next ( it:iterator<auto(TT)>; var value : TT& ) : bool {
    static_if (!typeinfo can_copy(type<TT>)) {
        concept_assert(false, "requires type
         which can be copied")
    } static_elif (typeinfo is_ref_value(type<TT>)) {
        var pValue : TT - & ?
        unsafe {
            if ( _builtin_iterator_iterate(it, addr(pValue)) ) {
                value = *pValue
                return true
            } else {
                return false
            }
        }
    } else {
        unsafe {
            return _builtin_iterator_iterate(it, addr(value))
        }
    }

请务必注意,内置迭代函数接受指针而不是引用。