Rust中的iter(), into_iter(), iter_mut()

在Rust中,iter(), into_iter(), iter_mut()都是用于在集合类型上创建迭代器的方法。这三个方法各有不同,下面一一进行介绍。

  1. iter(): iter() 方法创建一个不可变的引用迭代器。当你只想读取集合中的元素,而不想改变它们或消耗集合时,应使用 iter()iter() 返回的迭代器将生成集合中每个元素的不可变引用。

    let v = vec![1, 2, 3];
    for i in v.iter() {println!("{}", i);
    }
    

    在上面的代码中,i 的类型是 &i32,它是对元素的引用,我们不能修改这些元素。

  2. into_iter(): into_iter() 方法创建一个消耗集合的迭代器。into_iter() 会获取集合的所有权并返回集合中每个元素的所有权。在你想要转移集合中元素所有权时,应使用 into_iter()

    let v = vec![1, 2, 3];
    for i in v.into_iter() {println!("{}", i);
    }
    

    在这个例子中,i 的类型是 i32into_iter() 消耗了 v,这意味着 v 在此后不能再被使用。

  3. iter_mut(): iter_mut() 创建一个可变引用迭代器。当你想要修改集合中的元素时,应使用 iter_mut()iter_mut() 返回的迭代器将生成集合中每个元素的可变引用。

    let mut v = vec![1, 2, 3];
    for i in v.iter_mut() {*i += 1;
    }
    

    在这个例子中,i 的类型是 &mut i32,我们可以修改 v 中的元素。

总结:iter() 返回不可变引用,into_iter() 获取元素的所有权并消耗集合,iter_mut() 返回可变引用。选择哪一个取决于你是否需要修改元素或是否需要元素的所有权。

into_iter() 方法

在Rust中,into_iter 是一个方法,其功能是将一个集合转换成一个迭代器。这个迭代器可以逐个访问集合中的元素,使我们能够遍历集合。

不同于 iter()iter_mut()into_iter() 方法会消耗(take ownership of)原集合,这意味着集合在 into_iter() 调用之后将无法再次使用。这是因为 into_iter() 产生的迭代器每次迭代都会"移出"一个元素,直到集合为空。

以下是一个 into_iter() 的示例:

let vec = vec![1, 2, 3];
let mut iter = vec.into_iter();
assert_eq!(Some(1), iter.next());
assert_eq!(Some(2), iter.next());
assert_eq!(Some(3), iter.next());
assert_eq!(None, iter.next());

在这个例子中,我们创建了一个包含三个元素的向量,并通过调用 into_iter() 将其转换为一个迭代器。然后,我们通过反复调用 next() 来逐个获取元素。当所有元素都被取出后,next() 返回 None,表示没有更多的元素。

再次提醒,由于 into_iter() 会消耗原集合,所以在 into_iter() 调用之后,原向量 vec 就无法再次使用了。这就是所谓的"消耗性"迭代。

iter.next() 方法

在 Rust 中,iter.next() 是迭代器接口中的方法,用于获取序列中的下一个元素。next 方法的返回类型通常是 Option<T>,其中 T 是你正在迭代的集合中元素的类型。

当还有可用元素时,next 方法会返回 Some(element),这里的 element 是序列中的下一个元素。当所有元素都已经被迭代完,next 方法会返回 None,表示没有更多的元素可以迭代。

所以,iter.next() 返回 Some(1) 表示迭代器的下一个元素是 1。当你看到 assert_eq!(Some(1), iter.next()); 这样的代码时,它的意思是,我们期望迭代器的下一个元素是 1。如果不是,那么这个断言就会失败,程序就会停止执行。

请注意,迭代器会在每次调用 next 方法时消耗一个元素。这意味着如果你再次调用 next,你会得到序列中的下一个元素,或者如果没有更多元素,就会得到 None

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

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

相关文章

网页配色之黄金分割法 优漫动游

妇孺皆知&#xff0c;数学上有一个黄金分隔点--0.618。传闻用次比率数分隔是最具美感的&#xff0c;从美眉身体到高楼兴办&#xff0c;从事艺术工作术到美术无不出其之左&#xff0c;所以被称为"神秘的"黄金分隔点。与此同声&#xff0c;人们也对其举行了洪量的接洽&…

Jmeter基础篇(17)Jmeter中Stop和X的区别

一、前言 在Apache JMeter中&#xff0c;Stop和X之间存在一些区别。虽然它们都是用于结束测试的不同方法&#xff0c;但它们在实施方式和效果上存在一些差异。 二、Jmeter中的Stop 首先&#xff0c;让我们了解一下Stop。 在JMeter中&#xff0c;Stop是指在测试结束时关闭线…

redis单线程速度又快

Redis之所以在单进程单线程的情况下能够如此快速&#xff0c;主要有以下几个方面的原因&#xff1a; 纯内存操作&#xff1a;Redis将数据存储在内存中&#xff0c;而不是磁盘上。内存的读写速度远高于磁盘&#xff0c;因此Redis能够以极快的速度进行数据的读写操作。 非阻塞I…

css实现步骤条中的横线

实现步骤中的横线&#xff0c;我们使用css中的after选择器&#xff0c;content写空&#xff0c;然后给这个范围设定一个绝对定位&#xff0c;相当于和它设置伪类选择的元素的位置&#xff0c;直接看代码&#xff1a; const commonStyle useMemo(() > ({fontSize: 30px}),[]…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展&#xff0c;使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构&#xff0c;我们能够构建出更强大、可靠且可持续的前…

scp命令----跨服务器传输文件

scp命令 Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是 rcp 的加强版。 一、Linux scp 命令 以下是scp命令常用的…

windows安装npm, 命令简介

安装步骤 要在Windows上安装npm&#xff0c;按照以下步骤操作&#xff1a; 首先&#xff0c;确保您已经在计算机上安装了Node.js。可以从Node.js官方网站&#xff08;Node.js&#xff09;下载并安装Node.js。完成Node.js的安装后&#xff0c;打开命令提示符&#xff08;Command…

“深入解析Spring Boot:从入门到精通的完整指南“

标题&#xff1a;深入解析Spring Boot&#xff1a;从入门到精通的完整指南 摘要&#xff1a;本文将深入解析Spring Boot框架&#xff0c;从入门到精通&#xff0c;为读者提供全面的指南。我们将介绍Spring Boot的基本概念、核心特性以及使用方法&#xff0c;并通过示例代码演示…

【libuv】httpserver启用ssl 及 播放的日志打印

VLC vlc 第一次 接收不安全的证书黑屏。重启服务,再次vlc这次次好像就可以了。main debug: processing request item: zhangbin.flv, node: 播放列表, skip: 0 main debug: rebuilding array of current - root 播放列表 main debug: rebuild done - 2 items, index 1 main de…

Linux推出Debian 12.1,并进行多方面系统修复

据了解&#xff0c;Debian是最古老的 GNU / Linux 发行版之一&#xff0c;也是许多其他基于 Linux 的操作系统的基础&#xff0c;包括 Ubuntu、Kali、MX 和树莓派 OS 等。 此外&#xff0c;该操作系统以稳定性为重&#xff0c;不追求花哨的新功能&#xff0c;因此新版本的发布…

【Huawei】WLAN实验(三层发现)

拓扑图如上&#xff0c;AP与S1在同一VLAN,S1与AC在同一VLAN&#xff0c;AP采用三层发现AC&#xff0c;AP与客户的DHCP由S1提供。 S1配置 vlan batch 10 20 30 dhcp enable ip pool apgateway-list 192.168.20.1network 192.168.20.0 mask 255.255.255.0option 43 sub-option …

Lua脚本解决多条命令原子性问题

Redis是一个流行的键值存储数据库&#xff0c;它提供了丰富的功能和命令。在Redis中&#xff0c;我们可以使用Lua脚本来编写多条命令&#xff0c;以确保这些命令的原子性执行。Lua是一种简单易学的编程语言&#xff0c;下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…

行为型-状态模式(State Pattern)

概述 状态模式是一种行为设计模式&#xff0c;它可以让对象在内部状态改变时改变它的行为。简而言之&#xff0c;状态模式允许对象在不同状态下更改其行为&#xff0c;而不需要通过使用大量的条件语句进行手动更改。 优点&#xff1a; 状态模式将与特定状态相关的行为分散到…

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

问题引入 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图 【对应类图】 【分析】 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

JAVA-字符串生成图片

直接上代码 public static void main(String[] args) throws IOException {createFontImage("红色", new Font("宋体", Font.BOLD, 50), 400, 400);}/*** 根据str,font的样式将文字变成图片,然后返回一个流** param str 字符串* param font 字体* pa…

YOLOv5多模型推理,同时实现多个任务数据集识别。

YOLOv5-6.0多模型推理,同时实现多个任务数据集识别。 ↓下滑可见代码↓ YOLOv5-6.0多模型推理,同时实现多个任务数据集识别。 ↓下滑可见代码↓ YOLOv5-6.0多模型推理,同时实现多个任务数据集识别。 ↓下滑可见代码↓ YOLOv5-6.0多模型推理,同时实现多个任务数据集识别。 ↓…

高阶k8s二次开发教程 -- 通过阅读Istio源码习得

本篇文章全网几乎找不到&#xff0c;在做深层次的k8s二次开发时非常管用。那就是使用Client-go去访问自定义CRD资源。 我们先使用kubebuilder生成一个CRD&#xff0c;论生成CRD这些&#xff0c;还是kubebuilder更加方便。 创建CRD apiVersion: "apiextensions.k8s.io/v…

了解Unity编辑器 之组件篇Effects(十一)

一、Halo&#xff1a;是一个可用于游戏对象的特效组件&#xff0c;它可以在对象周围添加一个光晕效果 Color属性: 用于设置Halo的颜色。你可以通过选择颜色面板中的颜色来指定光晕的外观。选择适当的颜色可以使光晕与游戏场景中的其他元素相匹配或突出显示。 Size属性: 用于设…

[SQL挖掘机] - 视图介绍

介绍: 视图&#xff08;View&#xff09;是数据库中的一种虚拟表格&#xff0c;它是基于一个或多个实际表格&#xff08;或其他视图&#xff09;的查询结果集合。与实际表格不同&#xff0c;视图不包含实际存储的数据&#xff0c;而是根据定义在其之上的查询语句来动态生成数据…

LeetCode|backtracking|review:40. 131. 93. 47. 332. | 37. Sudoku Solver

复习&#xff1a; 40. Combination Sum II [1,1,2,3]中&#xff0c;答案里有[1,1,2], 但是不能有两个[1,2,3] 131. Palindrome Partitioning 每个for都是在给定的start之后找一个palindrome。当start 93. Restore IP Addresses forloop每次loop都是在给定的start的后三个数…