【Rust自学】13.5. 迭代器 Pt.1:迭代器的定义、iterator trait和next方法
13.5 迭代器 Pt.1迭代器的定义、iterator trait和next方法13.5.0. 写在正文之前Rust语言在设计过程中受到了很多语言的启发而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。在本章中我们会讨论 Rust 的一些特性这些特性与许多语言中通常称为函数式的特性相似- 闭包-迭代器本文- 使用闭包和迭代器改进I/O项目- 闭包和迭代器的性能13.5.1. 什么是迭代器提到迭代器就得先讲迭代器模式。迭代器模式允许你依次对一系列项里的每一个元素执行某些任务。而在这个过程中迭代器负责- 遍历每个项- 确定序列的遍历何时完成Rust的迭代器是懒惰的(lazy)除非调用消费迭代器的方法否则迭代器本身没有任何效果。这句话的意思大致是如果你在代码里写了迭代器但没有用到那么迭代器就相当于什么都没干。看个例子fn main() { let v1 vec![1, 2, 3]; let v1_iter v1.iter(); }v1是一个Vectorv1.iter()就是在给v1产生了一个迭代器赋给了v1_iter但是目前v1_iter没有被使用所以迭代器可以被看作没有任何效果。那我们使用迭代器来遍历fn main() { let v1 vec![1, 2, 3]; let v1_iter v1.iter(); for val in v1_iter { println!(Got: {}, val); } }这就相当于迭代器里的每个元素都被用在了一次循环里。13.5.2. Iterator trait所有的迭代器都实现了Iteratortrait。这个trait定义在标准库之下定义大致如下pub trait Iterator { type Item; fn next(mut self) - OptionSelf::Item; // methods with default implementations elided }这里面涉及两个新语法type Item和Self::Item这两个语法定义了与这个trait关联的类型这部分放在以后的文章讲。现在你需要知道的就是实现Iteratortrait需要你定义一个Item类型它用于next方法的返回类型迭代器的返回类型。Iterator这个trait仅要求实现一个方法——next。next方法每次调用都会返回迭代器中的一项也就是序列中的一个元素而由于返回类型是Option所以返回的结果会被包裹在Some变体里。如果迭代结束就会返回None。实际使用时可以直接在迭代器上调用next方法看个例子#[cfg(test)] mod tests { #[test] fn iterator_demonstration() { let v1 vec![1, 2, 3]; let mut v1_iter v1.iter(); assert_eq!(v1_iter.next(), Some(1)); assert_eq!(v1_iter.next(), Some(2)); assert_eq!(v1_iter.next(), Some(3)); assert_eq!(v1_iter.next(), None); } }v1是一个Vectorv1_iter是v1的迭代器由于下面的操作会被视为修改迭代器的状态所以得加mut关键字声明为可变。assert_eq!(v1_iter.next(), Some(1));这句话是第一次调用next就会返回Vector里第一个元素用Some包裹也就是Some(1)这里是1是因为迭代器的返回值是被Option类型包裹的不可变引用。assert_eq!(v1_iter.next(), Some(2));是第二次调用next就会返回Vector里第二个元素用Some包裹也就是Some(2)以此类推......在迭代器上调用next方法会更改迭代器用于跟踪其在序列中位置的内部状态。换句话说每一次调用就是消耗了这个迭代器里一个元素。而13.5.1中例子的for循环不需要mut是因为for循环实际上取得了v1_iter的所有权。13.5.3. 几种迭代方法刚才使用的iter方法生成的是一个不可变引用的迭代器通过next方法所取得的值实际上是指向Vector中的元素的不可变引用。into_iter方法创建的迭代器会获得所有权。也就是它在迭代元素时会把元素移动到新的作用域内并取得所有权。iter_mut方法在遍历值时使用的是可变的引用。

相关新闻

【Rust自学】12.5. 重构 Pt.3:移动业务逻辑

【Rust自学】12.5. 重构 Pt.3:移动业务逻辑

12.5 重构 Pt.3:移动业务逻辑 12.5.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为…

2026/10/18 10:35:50 阅读更多 →
智慧工地安全帽检测系统:YOLOv5与边缘计算实践

智慧工地安全帽检测系统:YOLOv5与边缘计算实践

1. 项目背景与核心价值在建筑施工现场,安全帽是保护工人头部安全的最后一道防线。根据行业统计数据显示,超过60%的头部伤害事故都与未正确佩戴安全帽有关。传统的人工巡检方式存在监管盲区大、响应滞后等问题,而"智慧工地安全帽佩戴检测…

2026/10/18 10:36:33 阅读更多 →
每日关注简报|2026年7月23日:Copilot成效仪表盘、Codex iOS升级、Windows 11新功能与AI财报

每日关注简报|2026年7月23日:Copilot成效仪表盘、Codex iOS升级、Windows 11新功能与AI财报

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/10/18 10:36:47 阅读更多 →

最新新闻

零基础也能创建AI智能体:三步搭建个人助手实战指南

零基础也能创建AI智能体:三步搭建个人助手实战指南

身边很多朋友一听到“AI智能体”这个词,第一反应都是:这玩意儿是不是得先学三个月Python,再搞懂什么API调用、微调模型,才配碰一碰?其实真不是。我刚开始接触的时候也抱着同样的刻板印象,直到我自己用纯聊天…

2026/10/18 16:49:44 阅读更多 →
JSP篇之JSP基础语法

JSP篇之JSP基础语法

JSP简介 (图片来源:慕课网) 常见的动态网站开发技术对比 (图片来源:慕课网) JSP页面元素简介以及page指令 JSP元素的构成 (图片来源:慕课网) 指令: JSP指…

2026/10/18 16:49:43 阅读更多 →
佳能相机SDK开发指南:从工业视觉接入到RAW实时处理

佳能相机SDK开发指南:从工业视觉接入到RAW实时处理

简介:本资源为佳能官方相机SDK开发套件,面向Windows平台C/VB开发者,用于构建远程控制、参数调节与图像采集类摄影应用,解决专业相机集成开发中API调用、库链接与环境配置等核心问题。压缩包共854个文件,174.44MB&#…

2026/10/18 16:49:43 阅读更多 →
高通平台音频驱动实战:从ASoC到音频DSP的完整链路

高通平台音频驱动实战:从ASoC到音频DSP的完整链路

刚接手高通平台安卓音频驱动开发时,我一度以为主要工作是改内核设备树、调codec寄存器。真正动手才发现,最耗时间的不是写代码,而是先把一条声音从APP到喇叭的完整链路弄清楚。高通平台的音频驱动和教科书里标准Linux ASoC架构有挺大区别&…

2026/10/18 16:49:43 阅读更多 →
ABS轮速传感器原理与故障排查:从磁电式到霍尔式的信号解读

ABS轮速传感器原理与故障排查:从磁电式到霍尔式的信号解读

简介:这是一份系统讲解ABS车轮速度传感器基本结构与工作原理的技术文档,适合汽车维修技师、汽车电子专业学生及对ABS系统感兴趣的从业者学习参考。资源包内含1个doc文档,压缩包整体仅226KB,聚焦轮速传感器的核心知识模块&#xff…

2026/10/18 16:49:43 阅读更多 →
Nacos 2.4.3 服务端部署实战:从单机到集群的落地指南

Nacos 2.4.3 服务端部署实战:从单机到集群的落地指南

简介:nacos-server-2.4.3.zip 是面向微服务开发者与运维人员的 Nacos 服务端发行包,对应 2.4.3 版本,可用于搭建服务注册与发现、动态配置管理及服务元数据管理平台,兼容 Spring Cloud、Dubbo、Kubernetes 等主流微服务生态&#…

2026/10/18 16:48:43 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →