学习笔记十四——一文看懂 Rust 迭代器

🌀 一文看懂 Rust 迭代器


📚 目录导航

  1. 什么是迭代器?为什么 Rust 到处都在用它?
  2. Rust 迭代器的底层逻辑是什么?
  3. 适配器 vs 消费者:谁是主角?
  4. 常见适配器:加工数据的全能工厂
  5. 常见消费者:迭代器的“吃货家族”
  6. Rust 如何保证高性能?为什么懒执行这么厉害?
  7. ✅ 高阶技巧通俗讲透:by_ref、提前消费
  8. 🧠 小白也能写的自定义迭代器:从逻辑到实战
  9. 总结 + 常见场景整理

1️⃣ 什么是迭代器?为什么 Rust 到处都在用它?

一句话:迭代器就是一个可以“一个个吐出值”的东西。

再通俗点:它像一个工人,负责“从集合里拿出元素”:

let v = vec![1, 2, 3];
let mut it = v.iter();println!("{:?}", it.next()); // Some(1)
println!("{:?}", it.next()); // Some(2)
println!("{:?}", it.next()); // Some(3)
println!("{:?}", it.next()); // None

每次调用 .next(),它就给你一个 Option<T> 类型的值:

  • 有值:Some(x)
  • 没值了:None

2️⃣ Rust 迭代器的底层逻辑是什么?

Rust 用 trait Iterator 抽象了所有“可以被一项一项访问”的数据结构:

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

你只需要实现 next(),它会一项一项地返回数据。每个适配器、消费者,都是围绕 next() 构建的!


3️⃣ 适配器 vs 消费者:谁才是主角?

对比适配器(Adapter)消费者(Consumer)
功能加工、变换、组合数据真正“把数据用掉”
是否懒执行✅ 是❌ 一调用就开始运行
是否返回迭代器✅ 返回新的迭代器❌ 返回值(Vec、i32、bool)
示例.map() .filter() .take().collect() .sum() .find()

类比思路 🧠:

适配器像工厂流水线,把原料(数据)加工好,
消费者像物流运输,把结果打包送到你手里。


4️⃣ 常见适配器:加工数据的全能工厂

名称用法示例通俗场景
map()加工每个元素.map(|x| x + 1)全部加 1、转大写等
filter()筛选元素.filter(|x| *x > 3)只要大于 3 的
take(n)只取前 n 个.take(2)分页、限流
skip(n)跳过前 n 个.skip(2)跳过表头等
enumerate()带索引.enumerate()打印编号
rev()倒序.rev()倒着打印
chain()拼接a.chain(b)合并多个集合

🌰 示例:

let result: Vec<_> = (1..=5).filter(|x| x % 2 == 1).map(|x| x * 10).collect();println!("{:?}", result); // [10, 30, 50]

5️⃣ 常见消费者:迭代器的“吃货家族”

名称用法示例作用
collect()收集为 Vec、HashMap 等.collect::<Vec<_>>()最常用
for_each()遍历做事.for_each(|x| println!("{}", x))替代 for 循环
sum()求和.sum::<i32>()累加数字
product()求积.product::<i32>()全部相乘
count()个数.count()数据量统计
find()找一个满足条件的值.find(|x| *x == 3)搜索场景
any()有一个满足条件?.any(|x| x > 5)判断存在性
all()全部满足条件?.all(|x| x > 0)校验条件

6️⃣ Rust 如何保证高性能?为什么懒执行这么厉害?

Rust 的迭代器用的是“懒加载”思想:

💤 什么叫懒?

不会一开始就执行所有 .map().filter(),而是只有你用 collect() 等消费器,才“触发”处理流程。

let iter = (1..=3).map(|x| {println!("处理 {}", x);x + 1
}); // 什么都不会打印let v: Vec<_> = iter.collect(); // 现在才开始打印

7️⃣ ✅ 高阶技巧通俗讲透

by_ref() 是啥?

你拿一个可变引用传递给某个适配器,就能保留迭代器状态。

🌰 示例:我们只想用这个迭代器的一部分

let mut it = vec![1, 2, 3, 4, 5].iter();let a: Vec<_> = it.by_ref().take(2).collect(); // 拿前两个
let b: Vec<_> = it.collect(); // 剩下的还可以继续用println!("{:?} {:?}", a, b); // [1, 2] [3, 4, 5]

8️⃣ 🧠 小白也能写的自定义迭代器:从逻辑到实战

你只要记住两点:

✅ 一个迭代器必须:

  1. 有个结构体保存状态(比如当前数)
  2. 实现 Iterator trait,提供 next() 方法

🌰 例子:自己写一个“从 1 数到 5”的迭代器

struct CountToFive {count: usize,
}impl Iterator for CountToFive {type Item = usize;fn next(&mut self) -> Option<Self::Item> {if self.count < 5 {self.count += 1;Some(self.count)} else {None}}
}
✅ 用法:
fn main() {let counter = CountToFive { count: 0 };for n in counter {println!("{}", n); // 输出 1 到 5}
}

📌 模板套路(记住就能写):

struct MyIter { 状态字段 }impl Iterator for MyIter {type Item = 返回的类型;fn next(&mut self) -> Option<Self::Item> {// 判断是否结束 + 返回 Some(...) or None}
}

✅ 什么场景该自己写?

  • 你要从 1 到 100,每次跳 7(非普通序列)
  • 你要包装异步、分页、网络流
  • 想把某个结构变成“可遍历”的对象

9️⃣ 总结:迭代器能做什么?为啥这么香?

优点表现
✅ 安全没有手动索引越界的烦恼
✅ 高性能零成本抽象,懒执行,自动内联
✅ 表达力强写起来非常流畅,读起来像“数据管道”
✅ 可组合map + filter + take 无限组合
✅ 可扩展你可以实现自己的迭代器,复用逻辑

🚀 常见实战场景:

  • 遍历 Vec、HashMap、文件行
  • 过滤无效数据
  • 求和 / 聚合统计
  • 实现分页 / 分批处理
  • 管道式业务数据处理(流式处理)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QR轻量二维码生成系统PHP源码

源码介绍 基于PHP编写的二维码在线生成系统。只需点击几下就可以生成您的个人二维码&#xff01;上传您的徽标&#xff0c;选择自定义颜色&#xff0c;生成多种类型。选择一个图案并下载最终的qrcode。可用格式&#xff1a;.png&#xff0c;.svg 效果预览 源码获取 QR轻量二…

基于Spring MVC的客户端真实IP获取方案解析

文章目录 基于Spring MVC的客户端真实IP获取方案解析概述核心方法解析代码实现工作流程 IP获取优先级策略IP有效性验证异常处理与日志使用场景注意事项扩展建议 基于Spring MVC的客户端真实IP获取方案解析 概述 在Web应用开发中&#xff0c;准确获取客户端真实IP地址是常见的…

Idea集成AI:CodeGeeX开发

当入职新公司&#xff0c;或者调到新项目组进行开发时&#xff0c;需要快速熟悉项目代码 而新的项目代码&#xff0c;可能有很多模块&#xff0c;很多的接口&#xff0c;很复杂的业务逻辑&#xff0c;更加有与之前自己的代码风格不一致的现有复杂代码 更别提很多人写代码不喜…

Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例

目录 一、背景&#xff1a;为什么Python需要JSON&#xff1f;二、核心技术解析&#xff1a;序列化与反序列化2.1 核心概念2.2 类型映射对照表 三、Python操作JSON的四大核心方法3.1 基础方法库3.2 方法详解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、实战…

【物联网】基于LORA组网的远程环境监测系统设计

基于LORA组网的远程环境监测系统设计 演示视频: 简介: 1.本系统有一个主机,两个从机。 2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数…

通过金融科技(Fintech)掌控财务:智能理财管理指南

李升伟 编译 在当今世界&#xff0c;科技几乎重塑了我们生活的方方面面&#xff0c;包括金钱的管理方式。金融科技&#xff08;Fintech&#xff09;让个人财务管理变得前所未有的便捷、高效和智能。从追踪支出到投资理财、提升信用评分&#xff0c;金融科技工具赋予个人掌控财…

html-css样式

1. 所有类型为文本的 元素的样式 指定所有类型为文本的 元素的样式 /* 文本框的样式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的宽度 */ padding: 25px; } font-size&#xff1a;字体大小 width&#xff1a;文本框宽度 padding&#…

【C语言基础】C++ 中的 `vector` 及其 C 语言实现详解

一、C 中的 vector&#xff1a;动态数组的核心特性 1. 基本概念 vector 是 C 标准模板库&#xff08;STL&#xff09;中的动态数组容器&#xff0c;支持自动扩容、高效元素访问和丰富的操作接口。其核心特性包括&#xff1a; 动态内存管理&#xff1a;自动调整容量&#xff0…

nvm切换node版本后,解决npm找不到的问题

解决方法如下 命令行查看node版本 node -v找到node版本所对应的npm版本 点击进入node版本 npm对应版本下载 点击进入npm版本 下载Windows 压缩包 下载完成后&#xff0c;解压&#xff0c;文件改名为npm 复制到你nvm对应版本的node_modules 下面 将下载的npm /bin 目录…

数据结构:最小生成树的普里姆算法和克鲁斯卡尔算法

对于一个带权&#xff08;假设每条边上的权均为大于零的实数&#xff09;连通无向图 G 中的不同生成树&#xff0c;其每棵树的所有边上的权值之和也可能不同&#xff1b;图的所有生成树中具有边上的权值之和最小的树称为图的最小生成树&#xff08;Minimal Spanning Tree&#…

Information-Theoretic Limits of Bistatic Integrated Sensing and Communication

摘要 双静态感知指的是发射器&#xff08;照亮目标&#xff09;和感知接收器&#xff08;估计目标状态&#xff09;在物理上分离的场景&#xff0c;这与发射和感知功能共存的单静态感知形成对比。在实际场景中&#xff0c;双静态感知可能需要应对系统约束&#xff0c;或者作为…

XCTF-web(四)

unserialize3 需要反序列化一下&#xff1a;O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;} php_rce 题目提示rce漏洞&#xff0c;测试一下&#xff1a;?s/Index/\think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]1 flag&#xff1…

Java Stream深度解析 高阶技巧与性能优化实战

文章目录 一、Stream底层机制揭秘1.1 Stream流水线架构1.2 Spliterator探秘 二、自定义收集器高级实现2.1 实现高性能统计收集器2.2 多级分组优化技巧 三、并行流深度优化3.1 并行度控制策略3.2 工作窃取(Work-Stealing)优化 四、无限流与短路操作4.1 生成无限质数流4.2 短路操…

TailwindCss快速上手

什么是Tailwind Css? 一个实用优先的 CSS 框架&#xff0c;可以直接在标记中组合以构建任何设计。 开始使用Tailwind Css 如何安装 下面是使用vite构建工具的方法 ①安装 Tailwind CSS: tailwindcss通过tailwindcss/vitenpm安装。 npm install tailwindcss tailwindcss…

Web前端 (CSS篇)

什么是CSS&#xff1f; css(Cascading Style Sheets)是层叠样式表或级联样式表&#xff0c;是一组设置规则&#xff0c;用于控制web页面外观。 为什么使用CSS? CSS 用于定义网页的样式&#xff0c;包括针对不同设备和屏幕尺寸的设计和布局。 CSS 实例 body {background-col…

微服务2--服务治理与服务调用

前言 &#xff1a;本文主要阐述微服务架构中的服务治理&#xff0c;以及Nacos环境搭建、服务注册、服务调用&#xff0c;负载均衡以及Feign实现服务调用。 服务治理 服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。 服务注册&#xff1a;在…

智能麻将出牌组件

开篇引言​ 麻将作为一款风靡全球的策略性游戏&#xff0c;其复杂的规则和多变的牌局给玩家带来了无尽乐趣。在数字化时代&#xff0c;运用编程技术为麻将游戏赋予智能&#xff0c;实现自动出牌功能&#xff0c;不仅能提升玩家体验&#xff0c;还能深入探索算法在博弈游戏中的…

“大湾区珠宝艺境花园”璀璨绽放第五届消博会

2025年4月13日&#xff0c;第五届中国国际消费品博览会&#xff08;以下简称"消博会"&#xff09;重要主题活动——《大湾区珠宝艺境花园》启动仪式在海南国际会展中心2号馆隆重举行。由广东省金银珠宝玉器业厂商会组织带领粤港澳大湾区优秀珠宝品牌&#xff0c;以“…

基于前端技术的QR码API开发实战:从原理到部署

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…

利用耦合有限元和神经网络计算的骨重塑模拟多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要&#xff1a;本文旨在开发一种基于有限元分析&#xff08;FEA&#xff09;和神经网络&#xff08;NN&#xff09;计算的多尺度分层混合模型&#xf…