【Rust自学】13.8. 迭代器 Pt.4:创建自定义迭代器

devtools/2025/1/21 2:19:23/

13.8.0. 写在正文之前

Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。

在本章中,我们会讨论 Rust 的一些特性,这些特性与许多语言中通常称为函数式的特性相似:

  • 闭包
  • 迭代器(本文)
  • 使用闭包和迭代器改进I/O项目
  • 闭包和迭代器的性能

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
请添加图片描述

13.8.1. 使用Iterator trait创建自定义迭代器

最主要的步骤就只有一步:提供next方法的实现。

看个例子:

做一个迭代器,从1遍历到5

rust">struct Counter {  count: u32,  
}  impl Counter {  fn new() -> Counter {  Counter { count: 0 }  }  
}  impl Iterator for Counter {  type Item = u32;  fn next(&mut self) -> Option<u32> {  if self.count < 5 {  self.count += 1;  Some(self.count)  } else {  None  }  }  
}
  • 先创建一个结构体叫Counter,它有count字段,用来存储迭代过程中所需要的数值,也就是迭代过程中的状态。这里count字段不使用pub而是设为私有是为了让Counter结构体独立管理它的值。

  • 然后在这个结构体上写了一个关联函数new用于创建新的实例,确保新实例从0开始。

  • 下面就需要为Counter这个结构体实现Iterator这个trait。Iterator trait有一个关联类型type Item还有一个next方法。首先把关联类型指定为u32,也就是写type Item = u32;。这个语法在第19章会细讲,现在知道这个迭代器会返回u32类型即可。

  • next函数的返回类型是Option<Self::Item>,由于上文写了关联类型指定为u32,所以可以理解为Option<u32>。当count字段小于5的时候就继续加1,如果大于等于5就返回None。这样就能保证从1到5的遍历。

现在我们来实现复杂一些的需求:

一样是Counter结构体,一个是从1到5,另一个是从2到5,把两个这样的迭代器的每对元素相乘,产生的新迭代器里的元素要求必须能被3整除,然后把这些元素的和返回

rust">fn using_other_iterator_traits_methods() {  let sum: u32 = Counter::new()  .zip(Counter::new().skip(1))  .map(|(a, b)| a * b)  .filter({|x| x % 3 == 0})  .sum();  
}
  • 这里我分行写是因为链式调用写在一行太长了,如果链式调用的代码没多长就没必要分行写
  • zip方法是把两个迭代器的每对元素和到一起形成新迭代器,这个新迭代器的元素就是元组,每个元组有两个值,分别来自两个迭代器。
  • Counter::new()就是建立一个从1到5的Counter结构体,Counter::new().skip(1)就是建立跳过1的Counter结构体,也就是从2到5。把这两个结构体实例使用zip和到一起就会形成如下表格的存储元组(Tuple)的迭代器:
Counter::new()Counter::new().skip(1)
Tuple 012
Tuple 123
Tuple 234
Tuple 345
PS:Counter::new()不会遍历到5是因为Counter::new().skip(1)在那时的值是None,程序就不会再生成值
  • map接收一个闭包,闭包作用于迭代器的每个元素。它把当前迭代器的每个元素给转换为另外一个元素,然后这些另外的元素就组成了一个新的迭代器。在这个例子中就是把迭代器存储的元组里的两个值相乘得到新的迭代器。
  • filter通过闭包把能整除3的值留下形成新的迭代器
  • sum消耗迭代器的所有元素,把其中的所有值相加求和

最后的结果应该是18


http://www.ppmy.cn/devtools/152241.html

相关文章

OA-CNN:用于 3D 语义分割的全自适应稀疏 CNN

大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 1介绍 2相关工作 基于点的学习。 基于 CNN 的学习。 动态卷积。 3全能自适应 3D 稀疏 CNN 3.1空间适应性感受野 赋予动机。 体素网格。 金字塔网格分区。 Adaptive 聚合器。 3.2自适应关…

VScode侧边栏左下角,没有NPM脚本,如何打开???

1.打开设置 2.用户->扩展->Npm 3.设置好了以后重启vscode&#xff0c;打开package.json文件&#xff0c;右上角的三个点就能看到

2025最新版IntelliJ IDEA for Mac安装使用指南

2025最新版IntelliJ IDEA for Mac安装使用指南 The Lastest IntelliJ IDEA Installation and Usage Guide for Mac in 2025 By JacksonML 用惯了集成开发环境(Integrated Development Environment&#xff0c; 即IDE), 就会习惯并一直用下去。 本文简要介绍来自捷克高科技公…

深度学习-卷积神经网络实战文档注释

1、call 方法 是一个特殊的方法&#xff0c;它允许类的实例表现得像函数一样。也就是说&#xff0c;你可以使用圆括号 () 来调用一个实例&#xff0c;就像调用普通函数一样。 当你调用 model(input_data) 时&#xff0c;实际上是调用了模型的 __ call __ 方法&#xff0c;其会自…

【嵌入式开发】stm32 st-link 烧录

使用 ST-Link 烧录 STM32 的程序可以通过多种工具实现&#xff0c;例如 STM32CubeProgrammer、Keil、IAR、以及 OpenOCD。以下是通用的步骤说明&#xff1a; 准备工作 硬件准备 确保 ST-Link 调试器与 STM32 芯片引脚正确连接&#xff1a; SWDIO (SWD 数据线) 接至 STM32 的 SW…

基于Linux系统指令使用详细解析

一 Linux系统常用操作命令编辑快捷 1.1终端快捷键&#xff1a; Ctrl a/Home 切换到命令行开始 Ctrl e/End 切换到命令行末尾 Ctrl l 清除屏幕内容&#xff0c;效果等同于 clear Ctrl u 清除剪切光标之前的内容 Ctrl k 剪切清除光标之后的内容 Ctrl y 粘贴刚才所删…

swin transformer中相对位置编码解析

在论文中&#xff0c;作者发现相对位置编码的效果会更好一些。 代码的实现为&#xff1a; # get pair-wise relative position index for each token inside the windowcoords_h torch.arange(self.window_size[0])coords_w torch.arange(self.window_size[1])coords tor…

51c自动驾驶~合集48

我自己的原文哦~ https://blog.51cto.com/whaosoft/13133866 #UDMC 考虑轨迹预测的统一决策控制框架 论文&#xff1a;https://arxiv.org/pdf/2501.02530 代码&#xff1a;​​https://github.com/henryhcliu/udmc_carla.git​​ 1. 摘要 当前的自动驾驶系统常常在确…