rust 语言 使用 迭代器

Last modified date

map:转换数据。接受一个闭包并为迭代器中的每个元素调用该闭包,然后返回一个新的迭代器,其中包含闭包返回的值。

let v = vec![1, 2, 3];
let v_squared: Vec<i32> = v.iter().map(|x| x * x).collect();

filter:过滤数据。接受一个闭包并为迭代器中的每个元素调用该闭包。如果闭包返回true,则元素将包含在新的迭代器中。

use std::collections::HashMap;
fn main() {
    let mut map: HashMap<&str, i32> = HashMap::new();
    map.insert("红宝石", 1);
    map.insert("蓝宝石", 2);
    map.insert("河边捡的误以为是宝石的破石头", 18);
    let evensvs: HashMap<&str, i32> = 
        map.into_iter().filter(|(a,b)|  *b == 2 && *a =="红宝石").collect();
    println!("{:?}", evensvs); 
}

chain:该方法是Iterator trait的一个方法,它允许你将两个迭代器链接在一起,形成一个新的迭代器。这个新的迭代器会先遍历第一个迭代器中的所有素,然后再遍历第二个迭代器中的所有元素。

fn main() {

    let v2 = vec![5, 10, 15];
    let v1 = vec![5, 10, 15];
    // copied():创建一个复制其所有元素的迭代器。
    // collect():将迭代器转换为集合。collect()可以接受任何可迭代的东西,并将其转换为相关的集合
    // 整体及为:将v1与v2 联结在一起,并创建一个复制的迭代器,并转换为集合。
    let  kv:Vec<i32> = v1.iter().chain(v2.iter()).copied().collect();

    println!("{:?}", kv); 

}

自定义结构体,使用迭代器

// 需要实现Iterator trait,并实现next方法

#[derive(Debug)]
struct People<'a> {
    name : &'a str,
    worki : i32,// 次数
    
}

impl Iterator for People<'static> {
    type Item = i32;


    fn next(&mut self) -> Option<Self::Item> {
        self.worki = self.worki + 1;


        if self.worki >= 10 {
            None
        }else {
            Some(self.worki)
        }
    }
}


fn main() {
    let mut pe = People{
        name :"ceshi",
        worki: 0,
    };

    let pp = &pe.next();

    println!("1,{:#?}",pp);
    let pp = &pe.next();

    println!("2,{:#?}",pp);
    let pp = &pe.next();

    println!("3,{:#?}",pp);
    println!("pe,{:#?}",pe);

}
输出:
1,Some(
    1,
)
2,Some(
    2,
)
3,Some(
    3,
)
pe,People {
    name: "ceshi",
    worki: 3,
}

weijiang