• Iterators

    Iterators

    Iterator trait 用来实现关于集合(collection)类型(比如数组)的迭代器。

    这个 trait 只需定义一个指向 next(下一个)元素的方法,这可手动在 impl 代码块中定义,或者自动定义(比如在数组或区间中)。

    为方便起见,for 结构通常使用 .into_iterator() 方法将一些集合类型转换为迭代器。

    下面例子展示了如何访问使用 Iterator trait 的方法,关于这方面的更多内容可点击这里查看。

    1. struct Fibonacci {
    2. curr: u32,
    3. next: u32,
    4. }
    5. // 实现关于 `Fibonacci` (斐波那契)的 `Iterator`。
    6. // `Iterator` trait 只需定义一个指向 `next`(下一个)元素的方法。
    7. impl Iterator for Fibonacci {
    8. type Item = u32;
    9. // 我们在这里使用 `.curr` 和 `.next` 来定义数列(sequence)。
    10. // 返回类型为 `Option<T>`:
    11. // * 当 `Iterator` 结束时,返回 `None`。
    12. // * 其他情况,返回被 `Some` 包裹(wrapped)的下一个值。
    13. fn next(&mut self) -> Option<u32> {
    14. let new_next = self.curr + self.next;
    15. self.curr = self.next;
    16. self.next = new_next;
    17. // 既然斐波那契数列不存在终点,那么 `Iterator` 将不可能
    18. // 返回 `None`,而总是返回 `Some`。
    19. Some(self.curr)
    20. }
    21. }
    22. // 返回一个斐波那契数列生成器(generator)
    23. fn fibonacci() -> Fibonacci {
    24. Fibonacci { curr: 1, next: 1 }
    25. }
    26. fn main() {
    27. // `0..3` 是一个 `Iterator`,会产生:0,1 和 2。
    28. let mut sequence = 0..3;
    29. println!("Four consecutive `next` calls on 0..3");
    30. println!("> {:?}", sequence.next());
    31. println!("> {:?}", sequence.next());
    32. println!("> {:?}", sequence.next());
    33. println!("> {:?}", sequence.next());
    34. // `for` 通过 `Iterator` 进行工作,直到 `Iterator` 为 `None`。
    35. // 每个 `Some` 值都被解包(unwrap)且限定为一个变量(这里是 `i`)。
    36. println!("Iterate through 0..3 using `for`");
    37. for i in 0..3 {
    38. println!("> {}", i);
    39. }
    40. // `take(n)` 方法提取 `Iterator` 的前 `n` 项。
    41. println!("The first four terms of the Fibonacci sequence are: ");
    42. for i in fibonacci().take(4) {
    43. println!("> {}", i);
    44. }
    45. // `skip(n)` 方法通过跳过前 `n` 项缩短了 `Iterator` 。
    46. println!("The next four terms of the Fibonacci sequence are: ");
    47. for i in fibonacci().skip(4).take(4) {
    48. println!("> {}", i);
    49. }
    50. let array = [1u32, 3, 3, 7];
    51. // `iter` 方法对数组/slice 产生一个 `Iterator`。
    52. println!("Iterate the following array {:?}", &array);
    53. for i in array.iter() {
    54. println!("> {}", i);
    55. }
    56. }