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` 包裹(wrap)的下一个值。
  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. // 返回一个斐波那契数列生成器
  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` 直到返回 `None`,
  35. // 并且每个 `Some` 值都被解包(unwrap),然后绑定给一个变量(这里是 `i`)。 println!("Iterate through 0..3 using `for`");
  36. for i in 0..3 {
  37. println!("> {}", i);
  38. }
  39. // `take(n)` 方法提取 `Iterator` 的前 `n` 项。
  40. println!("The first four terms of the Fibonacci sequence are: ");
  41. for i in fibonacci().take(4) {
  42. println!("> {}", i);
  43. }
  44. // `skip(n)` 方法移除前 `n` 项,从而缩短了 `Iterator` 。
  45. println!("The next four terms of the Fibonacci sequence are: ");
  46. for i in fibonacci().skip(4).take(4) {
  47. println!("> {}", i);
  48. }
  49. let array = [1u32, 3, 3, 7];
  50. // `iter` 方法对数组/slice 产生一个 `Iterator`。
  51. println!("Iterate the following array {:?}", &array);
  52. for i in array.iter() {
  53. println!("> {}", i);
  54. }
  55. }