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

Rust语言之迭代器

文章目录

    • Rust迭代器
    • Rust迭代器的实现
      • Iterator特型
      • IntoIterator特型
      • for循环与迭代器
    • 迭代器类型
      • 再看for循环
    • 实现自定义迭代器
      • 方式一
      • 方式二
    • 相关参考

Rust迭代器

Rust语言内置了迭代器模式,用于实现对一个项的序列进行特定的处理,通常配合for循环使用。当我们使用for...in遍历一个容器向量时,其实就是在使用迭代器:

let vec = vec![1, 2, 3];for val in vec {println!("{} ", val);
}

为了方便开发者的使用,for...in表达式隐藏了很多迭代器的使用和实现细节,这些我们将在后面慢慢看到。

Rust迭代器的实现

Rust迭代器的实现基于两个关键的特型:IteratorIntoIterator,在Rust中,迭代器指的是任何实现std::iter::Iterator特型的值,而IntoIterator用于生成某种类型的迭代器。

Iterator特型

Rust标准库中Iterator特型定义如下:

trait Iterator {type Item;  // 产生值的类型fn next(&mut self) -> Option<Self::Item>;   // 迭代器... //其它迭代器方法
}

Item是迭代器产生值的类型。next方法返回Option枚举值,当值为Some(v)时,v存储迭代器的下一个值;值为None时,表示序列终止。

IntoIterator特型

如果某种类型是可迭代的,那么它可以实现std::iter::IntoIterator特型。IntoIterator提供into_iter方法用于接收一个值,然后基于这个值返回一个迭代器。Rust标准库中IntoIterator特型定义如下:

trait IntoIterator where Self::IntoIter::Item == Self::Item {type Item;  // 产生值的类型type IntoIter: Iterator;    // 迭代器的类型fn into_iter(self) -> Self::IntoIter;   // 返回一个迭代器
}

IntoIter是迭代器自身的类型,Item是迭代器产生值的类型。接下来,我们再来看for循环。

for循环与迭代器

for循环的语法形式如下:

for loop_variable in collection {code()
}

这里,变量collections就是实现了Iterator和IntoIterator的类型。Rust在后台会对上述代码进行扩展,因此,for循环的实际执行代码如下:

{let mut _iter = std::iter::IntoIterator::into_iter(collections);loop {match _iter.next() {Some(loop_variable) => {code()},None => break,}}
}

可以看到,for循环的本质就是使用into_iterator()方法将一些集合类型转换为迭代器,再使用next()方法逐个遍历序列。

迭代器类型

Rust中大多数集合类型提供了不止一个IntoIterator的实现,可用来产生迭代项不可变引用、可变引用或者值类型的迭代器,对应方法和描述如下表:

方法描述等价形式
into_iter()返回一个只读不可重入迭代器,迭代器元素的类型为 Tv.into_iter()
iter()返回一个只读可重入迭代器,迭代器元素的类型为 &T(&v).into_iter()
iter_mut()返回一个可修改可重入迭代器,迭代器元素的类型为 &mut T(&mut v).into_iter()

其中,要说明的是iteriter_mut并不是属于某种特型的方法,它们是这些集合类型额外提供的方法,可以理解为是一种简化版的使用形式。

再看for循环

由于for循环会对其操作数应用into_iterator()方法,因此这三个实现就可以消费集合并取得其元素的所有权,以及支持迭代集合的不可变引用、可变引用:

for element in collection {}    等效于 for element in collection.into_iter() {}    // 执行后,collection所有权会被转移,无法再访问
for element in &collection {}   等效于  for element in collection.iter() {}
for element in &mut collection {} 等效于  for element in collection.iter_mut() {}

实现自定义迭代器

Rust中实现自定义迭代器本质上就是为自定义类型实现Iterator和IntoIterator特型。

方式一

struct Counter {max: i32,// `count` tracks the state of this iterator.count: i32,
}impl Counter {fn new(max: i32) -> Counter {Counter { count: -1, max: max }}
}impl Iterator for Counter {type Item = i32;fn next(&mut self) -> Option<Self::Item> {self.count += 1;if self.count < self.max {Some(self.count)} else {None}}
}// 使用for循环遍历迭代器使用
for i in Counter::new(10) {println!("{}", i);
}

方式二

struct Counter {max: i32,// No need to track the state, because this isn't an iterator.
}impl Counter {fn new(max: i32) -> Counter {Counter { max: max }}
}impl IntoIterator for Counter {type Item = i32;type IntoIter = std::ops::Range<Self::Item>;fn into_iter(self) -> Self::IntoIter {std::ops::Range{ start: 0, end: self.max }}
}for i in Counter::new(10) {println!("{}", i);
}

相关参考

  • 《Rust程序设计》
  • 《Rust程序设计语言》
  • Rust 迭代器 Iterator:https://www.twle.cn/c/yufei/rust/rust-basic-iterator.html

相关文章:

Rust语言之迭代器

文章目录Rust迭代器Rust迭代器的实现Iterator特型IntoIterator特型for循环与迭代器迭代器类型再看for循环实现自定义迭代器方式一方式二相关参考Rust迭代器 Rust语言内置了迭代器模式&#xff0c;用于实现对一个项的序列进行特定的处理&#xff0c;通常配合for循环使用。当我们…...

TreeSet 与 TreeMap And HashSet 与 HashMap

目录 Map TreeMap put()方法 : get()方法 : Set> entrySet() (重) : foreach遍历 : Set 哈希表 哈希冲突 : 冲突避免 : 冲突解决 ---- > 比散列(开放地址法) : 开散列 (链地址法 . 开链法) 简介 : 在Java中 , TreeSet 与 TreeMap 利用搜索树实现 Ma…...

Java围棋游戏的设计与实现

技术&#xff1a;Java等摘要&#xff1a;围棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为S…...

第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat

文章目录第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat使用选项运行 irisstatirisstat Options第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat 使用选项运行 irisstat 不带选项运行 irisstat 会生成基本报告。通常&#xff0c;…...

【博客619】PromQL如何实现Left joins以及不同metrics之间的复杂联合查询

PromQL如何实现Left joins以及不同metrics之间的复杂联合查询 1、场景 我们需要在PromQL中实现类似SQL中的连接查询&#xff1a; SELECT a.value*b.value, * FROM a, b2、不同metrics之间的复杂联合查询 瞬时向量与瞬时向量之间进行数学运算&#xff1a; 例如&#xff1a;根…...

Win11自定义电脑右下角时间显示格式

Win11自定义电脑右下角时间显示格式 一、进入附加设置菜单 1、进入控制面板&#xff0c;选择日期和时间 2、选择修改日期和时间 3、选择修改日历设置 4、选择附加设置 二、自定义时间显示出秒 1、在选项卡中&#xff0c;选时间选项卡 2、在Short time的输入框中输入H:m…...

TrueNas篇-trueNas Scale安装

安装TrueNAS Scale 在尝试trueNas core时发下可以成功安装&#xff0c;但是一直无法成功启动&#xff0c;而且国内对我遇见的错误几乎没有案例&#xff0c;所以舍弃掉了&#xff0c;而且trueNas core是基于Linux的&#xff0c;对Linux的生态好了很多&#xff0c;还可以可以在t…...

element表单搜索框与表格高度自适应

一般在后台管理系统中&#xff0c;表单搜索框和表格的搭配是非常常见的&#xff0c;如下所示&#xff1a; 在该图中&#xff0c;搜索框有五个&#xff0c;分为了两行排列。但根据大多数的UI标准&#xff0c;搜索框默认只显示一行&#xff0c;多余的需要进行隐藏。此时的页面被…...

MySQL使用技巧整理

title: MySQL使用技巧整理 date: 2021-04-11 00:00:00 tags: MySQL categories:数据库 重建索引 索引可能因为删除&#xff0c;或者页分裂等原因&#xff0c;导致数据页有空洞&#xff0c;重建索引的过程会创建一个新的索引&#xff0c;把数据按顺序插入&#xff0c;这样页面…...

七大设计原则之里氏替换原则应用

目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则&#xff08;Liskov Substitution Principle,LSP&#xff09;是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时&#xff0c;程序 P…...

1行Python代码去除图片水印,网友:一干二净

大家好&#xff0c;这里是程序员晚枫。 最近小明在开淘宝店&#xff08;店名&#xff1a;爱吃火锅的少女&#xff09;&#xff0c;需要给自己的原创图片加水印&#xff0c;于是我上次给她开发了增加水印的功能&#xff1a;图片加水印&#xff0c;保护原创图片&#xff0c;一行…...

Connext DDS属性配置参考大全(2)

DDSSecure安全com.rti.servcom.rti.serv.load_plugin...

一起Talk Android吧(第四百九十二回:精简版动画)

文章目录概念介绍使用方法示例代码经验总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"动画集合&#xff1a;AnimatorSetBuilder",这一回中咱们说的例子是" 精简版动画"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&…...

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…...

【Vue3源码】第一章 effect和reactive

文章目录【Vue3源码】第一章 effect和reactive前言1、实现effect函数2、封装track函数&#xff08;依赖收集&#xff09;3、封装reactive函数4、封装trigger函数&#xff08;依赖触发&#xff09;5、单元测试【Vue3源码】第一章 effect和reactive 前言 今天就正式开始Vue3源码…...

C函数指针

函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、数组或字符型等变量&#xff0c;而函数指针是指向函数。函数指针可以像一般函数一样&#xff0c;用于调用函数、传递参数。函数指针变量的声明&#xff1a;typedef int (*fun_ptr)(int,int); // 声明一个指…...

2023同等学力申请硕士计算机综合国考

同等学力国考报名要开始了 2023年2月15日&#xff0c;中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”&#xff08;https://tdxl.chsi.com.cn&#xff0c;联系服务电话&#xff1a;010-67410388&#xff09;公布报名工作通知。考生须按照通知要求进行注册或…...

英语基础-并列句概述

什么是并列句&#xff1f;并列句就是用连词把独立的句子连接起来&#xff0c;使得句子之间产生并列的逻辑。 1. 并列句中的逻辑 1. 小明步行上学&#xff0c;小红骑自行车上班。 Ming goes to school on foot,and Hong goes to work by bike. 平行逻辑 2. 小红经常玩手机…...

大数据框架之Hadoop:HDFS(一)HDFS概述

1.1HDFS产出背景及定义 HDFS 产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#xff0c;这就是分布式文件…...

20230210组会论文总结

目录 【Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method】 【ShuffleMixer: An Efficient ConvNet for Image Super-Resolution】 【A Close Look at Spatial Modeling: From Attention to Convolution 】 【DEA-Net: Single i…...

Python - 数据容器dict(字典)

目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对&#…...

傻白探索Chiplet,文献阅读笔记汇总(十二)

Summary&#xff08;方便分类管理&#xff09; Article&#xff08;文献出处&#xff09; 方便再次搜索 Data&#xff08;文献数据&#xff09; 总结归纳&#xff0c;方便理解 Comments&#xff08;对文献的想法&#xff09;/Why&#xff08;为什么看这篇文献&#xff09;强…...

#电子电气架构——Vector工具常见问题解决三板斧

我是穿拖鞋的汉子,魔都中一位坚持长期主义的工科男。 今天在与母亲聊天时,得到老家隔壁邻居一位大姐年初去世的消息,挺让自己感到伤感!岁月如流水,想抓都抓不住。想起平时自己加班的那个程度,可能后续也要自己注意身体啦。 老规矩,分享一段喜欢的文字,避免自己成为高知…...

文本三剑客之grep

Grep是Linux用户用来搜索文本字符串的命令行工具。您可以使用它在文件中搜索某个单词或单词的组合&#xff0c;也可以将其他Linux命令的输出通过管道传输到grep&#xff0c;因此grep可以仅显示您需要查看的输出。grep的命令格式如下&#xff1a;grep 选项 查找条件 目标文件…...

pwn手记录题1

fuzzerinstrospector(首届数字空间安全攻防大赛) 主体流程&#xff08;相对比较简单&#xff0c;GLibc为常见的2.27版本&#xff0c; Allocate申请函数&#xff08;其中有两个输入函数Read_8Int、Read_context&#xff1b; 还存在着后门函数&#xff1b; 关键点在于如何利用…...

自动驾驶规划 - Apollo Lattice Planner算法【1】

文章目录Lattice Planner简介Lattice Planner 算法思路1. 离散化参考线的点2. 在参考线上计算匹配点3. 根据匹配点&#xff0c;计算Frenet坐标系的S-L值4. parse the decision and get the planning target5. 生成横纵向采样路径6. 轨迹cost值计算&#xff0c;进行碰撞检测7. 优…...

以太坊数据开发-Web3.py-安装连接以太坊数据

Web3.py是连接以太坊的python库&#xff0c;它的API从web3.js中派生而来。如果你用过web3.js&#xff0c;你会对它的API很熟悉。但惭愧的是&#xff0c;作为一个以太坊上Dapp的开发者&#xff0c;我几乎没有直接使用过web3.js&#xff0c;也没有看过它的API。 官网&#xff1a…...

【触摸屏功能测试】MQTT_STD本地调试说明-测试记录

1、MQTT简介 MQTT是一种基于发布/订阅模式的“轻量级”通讯协议。它是针对受限的、低带宽的、高延迟的、网络不可靠的环境下的网络通讯设备设计的。 发布是指客户端将消息传递给服务器&#xff0c;订阅是指客户端接收服务器推送的消息。每个消息有一个主题&#xff0c;包含若干…...

六十分之十三——黎明前

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.吴军系列硅谷来信1听书、香帅的北大金融…...

【Call for papers】CRYPTO-2023(CCF-A/网络与信息安全/2023年2月16日截稿)

Crypto 2023 will take place in Santa Barbara, USA on August 19-24, 2023. Crypto 2023 is organized by the International Association for Cryptologic Research (IACR). The proceedings will be published by Springer in the LNCS series. 文章目录1.会议信息2.时间节…...

都匀住房和城乡建设部网站/搜索引擎营销是指

android默认的视频采集格式是NV21&#xff0c;&#xff08;属于YUV420&#xff09; 在onPreviewFrame中传进来的byte[] data即为NV21格式。 旋转算法 对NV21进行顺时针旋转90度&#xff0c;180度和270度算法。 旋转90度 privatebyte[] rotateYUV420Degree90(byte[] data, int i…...

网络编程有哪些/百度搜索优化

焦红伟&#xff0c;博士&#xff0c;副教授&#xff0c;硕士生导师&#xff0c;河南省高校青年骨干教师。2015年毕业于西安电子科技大学&#xff0c;获理学博士学位。主要从事最优化算法及应用、系统优化、智能优化算法及应用等方面的研究工作。近年来对非凸规划问题的全局优化…...

工邦邦官网/杭州seo俱乐部

IE的脚本错误对话框非常不友好,无法copy详细信息 (至少IE7是这样)。发现Firefox的Tools > Error Console 中也可以看到错误信息而且可以Copy! 调试程序时&#xff0c;在VS中将默认浏览器设置为Firefox就可以调试并可以Copy脚本错误信息了...

佛山微网站建设哪家专业/本地建站软件有哪些

在java1996年发布,当年12月即发布了java bean1.00-A,有什么用呢?通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB;EJB功能强大,但是太重…...

营销型企业网站建设教案/百度引擎的搜索方式是什么

首先创建二叉树&#xff0c;然后对二叉树遍历进行了单元测试。只要将相应的注释取消&#xff0c;便可以成功运行。 /******************************************** 二叉树遍历前序、中序、后序的递归和非递归实现 ********************************************/ #include<…...

wordpress首页静态/百度搜索提交入口

什么是MetatableLua中Metatable这个概念, 国内将他翻译为元表. 元表为重定义Lua中任意一个对象(值)的默认行为提供了一种公开入口. 如同许多OO语言的操作符重载或方法重载. Metatable能够为我们带来非常灵活的编程方式.具体的说, Lua中每种类型的值都有都有他的默认操作方式, 如…...