rust从入门到放弃(十一):迭代器


rust从入门到放弃(十一):迭代器

迭代器顾名思义就是帮我遍历集合内元素的工具,熟悉Java 编程都知道我们可以通过迭代器去遍历集合,通过hasNext 判断是否还有下一个,next 获取下一个元素。如下java代码

  ArrayList numbers = new ArrayList();
  while(it.hasNext()) {
    Integer i = it.next();
        if(i < 10) {  
             it.remove();  // 删除小于 10 的元素
         }
  }

迭代器的原理就是通过 next 不断地遍历集合里面的元素。我们看一下rust 里面迭代器trait的定义。

pub trait Iterator {
   type Item;
   fn next(&mut self) -> Option;
}
  

可以看到和上面的java 的定义是类似的,需要我们的对象去实现next 方法,从而在遍历的时候通过next 逐个获取集合元素。如果返回的Option里面有值则继续遍历,如果返回空则停止遍历。我们尝试实现一个next 迭代器。

struct Seq {
    current : i32
}
impl Seq {
    fn new() -> Self {
        Seq { current: 0 }
    }
}
impl Iterator for Seq {
    type Item = i32;
    fn next(&mut self) -> Option { //实现 next方法
        if self.current < 100 {
        self.current += 1;
        return Some(self.current); 
        } else { 
            return None; 
        } 
    }
}
fn main() {
    let mut seq = Seq::new();
    while let Some(i) = seq.next() {
        println!("{}", i);
    }
}

你可能会说,什么鬼,如果我不去实现 Iterator 也可以直接调用next 去实现这个功能。对,迭代器的作用远不止如此。我们可以通过迭代器去遍历集合

fn main() {
    let v = vec![1,2,3,4,5];
    let mut iter = v.iter();
    while let Some(i) = iter.next() {
        println!("{}", i);
    }
}

你又会说,我通过for 循环遍历就可以,还是没有啥特别的。那么我来一个函数级联例子

fn main() {
    let v = vec![1,2,3,4,5,6,7,8,9];
    let mut iter = v.iter() // 获取迭代器
        .take(5)            // 获取前5 个元素
        .filter(|&x| x % 2 == 0) // 过滤偶数
        .map(|&x| x * x)   // 求平方
        .enumerate();     // 转为带数组下标的迭代器
    while let Some((i, v)) = iter.next() {
        println!("{} {}", i, v);
    }
}

上面的程序输出的结果为

0 4
1 16

分别是 2 和 4 的平方。我们可以通过迭代器对数据进行流式的处理,非常简洁。

我们再深度思考一下,其实 for 循环的本质也是依赖迭代器,后面在源码介绍的时候,我们再详细聊这个话题。总结一下,迭代器可以帮我们高效的完成集合元素的遍历和数据处理,我们只需要实现 next 方法就可以实现迭代器。

展开阅读全文

页面更新:2024-04-29

标签:偶数   遍历   高效   数据处理   数组   顾名思义   标的   这个话题   简洁   源码   深度   入门   本质   例子   元素   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top