Please enable Javascript to view the contents

[Rust Std Trait] Iterator 初见

 ·  ☕ 1 分钟

前言

    迭代器是 Rust 中的重要功能之一,在 Rust 中迭代器指的是实现了 Iterator trait 的类型。本文以最短篇幅囊括迭代器的相关知识点。

实现 Interator

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
extern crate hello_rust;

struct Counter {
    num: i32,
}

impl Iterator for Counter {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.num < 6 {
            self.num += 1;
            Some(self.num)
        } else {
            None
        }
    }
}

fn main() {
    let c = Counter { num: 0 };
    for n in c {
        println!("{}", n);
    }

    println!("end!");
}

迭代器的组合

    Rust 迭代器的一个重要特性就是可以组合的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn main() {
    let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];

    v.iter()
        .take(5)
        .filter(|&x| x % 2 == 0)
        .map(|&x| x * x)
        .for_each(|x| println!("{}", x));

    println!("end!");
}

如此写法除了可读性较高以外还有对并行计算友好的优点(详细的可参考 Rust 各种并行库)。

惰性求值

    Rust 迭代器的另一个特性就是惰性求值:

1
2
let v = vec![1,2,3,4,5];
v.iter().map(|x| println!("{}", x));

上面的代码并不会打印任何东西,因为想要迭代器运行需要消费数据的操作,例如 v.iter().map(...).for_each(|x| println!("{}", x));

分享

saberuster
作者
saberuster
一个喜欢编程和折腾的追风少年