当前位置: 首页 > news >正文

rust学习笔记18-迭代器

迭代器是处理集合数据的重要工具,Rust 的迭代器提供了一种高效、灵活的方式来处理集合数据。

1.创建迭代器
iter():生成元素的不可变引用(&T),不转移所有权。
into_iter():转移所有权,遍历后原集合不可再用。
iter_mut():生成元素的可变引用(&mut T),允许修改元素。

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let i = v.iter();
    let sum:i32 = i.sum();
    println!("{}", sum);
    // 使用iter创建迭代器,所有权不会转移
    println!("{:?}", v);
    
    let mut v2 = vec![1, 2, 3, 4, 5];
    // 使用iter_mut 可以修改集合元素值
    for i in v2.iter_mut(){
        *i += 2;
    }
    println!("{:?}", v2);

    let v3 = vec![1, 2, 3, 4, 5];
    let s2 = v3.into_iter();
    let sum2:i32 = s2.sum();
    println!("{}", sum2);
    // 使用into_iter创建迭代器,所有转移转移v3无法再使用
    println!("{:?}", v3);
}

2.迭代器特性
惰性求值:适配器(如 map、filter)不会立即执行,需通过消耗器(如 collect、sum)触发计算。

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];

    let n1: Vec<_> = numbers.iter()
        .map(|x| x * 2)
        .filter(|&x| x > 5)
        .collect();
    
    println!("{:?}", n1); 
}

3.常用适配器
map:对每个元素进行转换。
filter:保留满足条件的元素。
take_while / skip_while:基于条件提前终止或跳过。
zip:合并两个迭代器,生成元组。
enumerate:添加索引,生成 (usize, T)。

4.消耗器
collect:收集为集合。
fold:累积计算。
sum / count:求和或计数。
all / any:检查所有或任意元素满足条件。

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let result: Vec<_> = v.iter()
    .enumerate()
    .filter(|(i, &x)| i % 2 == 0)
    .map(|(i, x)| x * 2)
    .collect();

    println!("{:?}", result);
    let sum = v.iter().fold(0, |acc, &x| acc + x); // 求和

    println!("{}", sum);
}

5.错误处理
使用 Result 时,collect 可汇总结果:

fn main() {
    let results: Vec<Result<i32, &str>> = vec![Ok(1), Err("error"), Ok(3)];
    let res: Result<Vec<_>, _> = results.into_iter().collect(); // 遇到第一个 Err 停止
    match res {
        Ok(l) => println!("res: {:?}", l),
        Err(e) => eprintln!("Error reading res: {}", e),
    }
   
}

总结 Rust 迭代器通过链式调用和惰性求值,提供了高效的声明式编程方式。掌握常用适配器和消耗器,能够编写简洁且高性能的代码。大力推荐使用。

相关文章:

  • 网络安全威胁与防护措施(上)
  • “锈化”Python:用Rust重塑Python生态的六大工具深度解析
  • 床头灯3000词:《傲慢与偏见》(Pride and Prejudice)阅读(英语学习)记录
  • 用爬虫解锁 Shopee 店铺商品数据,开启电商新洞察
  • springboot项目,mapper.xml里面,jdbcType报错 已解决
  • day 5 寄存器 时钟 堆栈
  • 蓝桥杯 之 暴力回溯
  • 分开6年,移居美国的吴秀波和被送进监狱的小三陈昱霖,如今都怎么样了?
  • springboot项目引用外部jar包,linux部署后启动失败,找不到jar包
  • Jvm运行时数据区有哪些
  • SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法
  • 2025年渗透测试面试题总结- PingCAP安全工程师(题目+回答)
  • 蓝桥杯十天冲刺-day1(日期问题)
  • 线程互斥量和信号量的使用(未完成)
  • 基于SpringBoot的社区/物业管理系统
  • Vala编程语言教程-语言元素
  • Netty源码—2.Reactor线程模型一
  • Microchip AN1477中关于LLC数字补偿器的疑问
  • Python列表2
  • JAVA学习-练习试用Java实现“编写一个Spark程序,结合Elasticsearch对大数据进行全文搜索和筛选“
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记
  • 特朗普访中东绕行以色列,专家:凸显美以利益分歧扩大
  • “降息潮”延续,多家民营银行下调存款利率
  • 刘国中:持续加强护士队伍建设,更好保障人民身体健康
  • 《淮水竹亭》:一手好牌,为何打成这样
  • 让胖东来“自闭”的玉石生意,究竟水有多深?