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

2023-11-19

在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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust中的iter(), into_iter(), iter_mut() 的相关文章

  • 如何创建静态字符串数组?

    Note这个问题包含 Rust 1 0 之前的语法 代码无效 但概念仍然相关 如何在 Rust 中创建全局静态字符串数组 对于整数 编译如下 static ONE u8 1 static TWO u8 2 static ONETWO sta
  • 使用 Serde 反序列化时有没有办法允许未知的枚举标签? [复制]

    这个问题在这里已经有答案了 我正在反序列化一个标记的枚举 derive Deserialize enum Foo A A B B C C 如果 Serde 遇到一个不存在的标签A B or C 那么就会抛出错误 有没有办法为未知标签添加包罗
  • 如何操作 Rust 数组的 2 个可变切片?

    我有一个函数需要对单个数组的两个部分进行操作 目的是能够建立一个 nostd 分配器 可以将更大数组的变量切片返回给调用者 并保留数组的其余部分以供将来分配 这是失败的示例代码 fn split lt a gt mut item a mut
  • 当替换器使用变量时,如何调用 Regex::replace_all?

    对于下面的代码 我尝试输出输入单词 后跟随机字符串 第一个函数可以编译 但我不想要它 因为它不使用随机字符串 第二个函数会产生编译器错误 我如何解决它 use regex Regex fn main let cd rust ok but i
  • 有没有办法以数组的形式访问结构体字段?

    我是 Rust 新手 正在尝试弄清楚这是否可行 因此 有时函数 方法以数组形式访问数据会更干净 有时按名称访问数据会更干净 在 Rust 中我可以定义这样的东西 struct Vector3D x f64 y f64 z f64 coord
  • 将相同变量绑定到共享特征的不同类型的模式

    我有一个关于通过特征共享某些行为的值的模式匹配的问题 我有一个带有两个变体的枚举 每个变体都有不同类型的绑定值 其中两种类型都实现一个特征 我试图弄清楚是否可以创建一个单一的模式 E VarA x E VarB x 形式 其中我将两种类型绑
  • 何时使用 Box> 或 Vec>?

    什么时候设计一个嵌套的数据结构才有意义 Box and a Vec 或相反亦然 似乎在大多数情况下 您想在堆上存储多个固定大小的东西 Box是多余的 因为它唯一的 作用是堆分配一个 单个值 以及一个正常的Vec已经在堆上分配其存储空间 背景
  • 是否可以在不使用“Arc”的情况下拥有“内部指针”?

    struct Device struct CommandBuffer device Device Does not work because Rust does not allow internal pointers struct Some
  • vscode 在哪里使用 lldb 可执行文件?

    我在 vscode 中调试 rust 时遇到困难 它无法评估任何涉及函数的表达式 我注意到我没有安装 lldb Ubuntu 20 04 但调试器仍在运行 在哪里可以找到 lldb 可执行文件 我可以改变路径吗 None
  • 如何在 Option::and_then 或 Option::map 闭包中使用 async/await 而不使用 OptionFuture?

    我想运行类似以下代码的代码 async fn get user s str gt Option
  • Diesel:添加子查询的结果

    给出下表 accounts id INTEGER opening balance INTEGER transactions debit INTEGER credit INTEGER amount INTEGER foreign key de
  • 2D 中的大量旋转

    我正在尝试使用 Bevy 0 3 并且我可以轻松使用内置转换Camera2dComponents default 这是自上而下的二维 问题在于尝试将玩家的旋转与鼠标同步 for event in evreader iter cursor m
  • 可变借用不止一次[重复]

    这个问题在这里已经有答案了 这是无法编译的简短示例的简短示例 错误在于add1功能 如果我这样做的话它会起作用add2 但这不是很干 有更多经验的人能否启发我如何以比以前更好的方式克服可变借用错误 add2 struct S1 full b
  • 如何与超级请求处理程序共享不可变的配置数据?

    我正在尝试用 Rust 开发一个基于超级的服务器应用程序 有一个 INI 文件保存诸如绑定 IP 数据库等配置 我不想在每个请求上解析 INI 文件 并且可以保留配置数据直到服务器重新启动 如何向请求处理程序提供已解析数据的结构 我尝试过几
  • 如何修改actix-web中间件中的请求数据? [复制]

    这个问题在这里已经有答案了 是否有推荐的方法来修改 actix web 上收到的请求 我正在寻找将数据添加到请求对象并使其可供下游中间件和处理程序处理的方法 The 中间件文档 https actix rs docs middleware
  • 使用写!使用字符串而不是字符串文字的宏

    我写了以下函数 fn print error text str let mut t term stdout unwrap t fg term color RED unwrap write t text unwrap assert t res
  • “功能性”Rust 对性能有哪些影响?

    我正在关注 Rust 轨道运动 io https exercism io 我有相当多的 C C 经验 我喜欢 Rust 的 功能 元素 但我担心相对性能 我解决了 行程编码 问题 https exercism io tracks rust
  • 令人困惑的无法访问模式错误

    在使用 Rust 编译器时 我遇到了一条非常令人困惑的错误消息match陈述 enum Name Known fn unreachable pattern n Name gt usize use Name match n Unknown g
  • 如何使用 Chrono 板条箱获取 Rust 中当前的工作日?

    我正在尝试使用 Chrono 板条箱获取 Rust 中当前的工作日 JavaScript 的等价物是这样的 new Date toLocaleDateString en US weekday long 我使用以下代码获取当前时间戳 let
  • 如何下载 Rust API 文档?

    有没有办法可以下载 Rust 的 API 库文档或生成它们 我可以在 Rust 源中找到的唯一文档位于src docs https github com rust lang rust tree master src doc 我正在运行夜间构

随机推荐

  • 个人整理的数据集(手写中文数据、发票数据、快递单数据、车牌数据)

    本人在工作生活中收集了各个方面比较多的真实的数据集如下 一 手写中文数据集 1 档案类数据 此数据集为手写档案数据 数量较大 大约128G 图像均未标注 ex 2 手写作文数据 此数据集为手写作文数据 是大约800M左右 图像按行提供位置和
  • 1081 检查密码

    本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能 该网站要求用户设置的密码必须由不少于6个字符组成 并且只能有英文字母 数字和小数点 还必须既有字母也有数字 输入格式 输入第一行给出一个正整数 N 100 随后 N 行 每行给
  • python判断一个数是奇数还是偶数_在python中检查一个数字是奇数还是偶数

    参见英文答案 gt python checking odd even numbers and changing outputs on number size 15个 我正在尝试制作一个程序 检查一个单词是否是一个回文并且我已经到目前为止它可
  • 基于依存句法分析的实体关系提取

    基于依存句法分析的实体关系提取 1 概述 概述 句法分析是自然语言处理中的关键技术之一 其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系 主要包括两方面的内容 一是确定语言的语法体系 即对语言中合法的句子的语法结构给与形式化的定义
  • 简明阐述MinGW,MSYS,MSYS2

    几年前的一个项目连同环境 不小心被我从硬盘上不可恢复的删掉了 为了挽救 没头苍蝇似的在网上闯荡了几天 发现自己以前对MinGW的理解有着很大的误区 本文不是攻略 只是希望以更简洁 清晰的描述 来帮助大家理解MinGW 防止重蹈我的覆辙 一
  • 小鼠脑立体定位图谱_超高分辨率小鼠脑三维图谱发布——脑研究者的屠龙刀

    大脑 作为生命活动的司令部 是结构和功能最为复杂的一种器官 因此 识别脑的三维结构 对于脑科学研究至关重要 然而由于技术的限制和脑结构的复杂性 多数脑形态结构图谱绘制工作局限于二维层面 高精度的小鼠脑三维参考图谱仍然进展缓慢 来自于ALLE
  • LastPass即将收费,是时候更换一款先得密码管理工具了!

    作者 弗拉德 来源 弗拉德 公众号 fulade me 前几天收到了LastPass的邮件 自2021年3月16日起 不再提供全平台的免费服务 用户只能选择一个平台享受免费 iOS Android 或者 PC端 邮件里还提到 购买会员享受2
  • C++——String类的增删查改

    目录 前言 1 String类的增删查改 1 1增 实验代码 运行结果 实验代码 运行结果 编辑 1 2删 实验代码 结果 1 3查找 练习 查找文件后缀 运行结果 1 4 改 前言 上篇博客中 我介绍了String类的基本成员函数 这些函
  • 存地失人,人地皆失;存人失地,人地皆存。

    存地失人 人地皆失 存人失地 人地皆存 埋骨何须桑梓地 人生无处不青山 出自近现代毛泽东的 七绝 改西乡隆盛诗赠父亲 孩儿立志出乡关 学不成名誓不还 埋骨何须桑梓地 人生无处不青山
  • 华为上机试题4(坐标移动)

    题目来自于http blog csdn net column details huaweicode html page 4 原文均是用的c 我用的java写的 题目描述开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S
  • 黑马JavaWeb综合案例

    目录 1 功能介绍 2 前期准备 2 1准备数据库 2 2pom文件 2 3mybatis config文件 3 用户登录注册 3 1html页面 3 1 1登录页面 3 1 2注册页面 3 2css文件 3 2 1register css
  • 【ML on Kubernetes】第 7 章:模型部署和自动化

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 小Biu的树(树形dp)

    小Biu的树 树形dp 题目描述 小Biu有一颗有根树 树上有n个节点 编号1 n 其中每个节点有一个苹果 每个苹果有一定的能量 现在小Biu和小Piu分别选出一棵子树 要求两棵子树不能相交而且所有苹果的能量和最大 输入 第一行输入一个正整
  • c++ 向量 最大值 最小值 位置 删除元素

    include
  • 软件测试大背景

    这是我的学习笔记 都是看视频时觉得重要的
  • zookeeper 搭建教程(完整版)

    zookeeper 搭建教程 完整版 1 解压zookeeper文件 root master tar zxvf opt software apache zookeeper 3 5 7 bin tar gz C opt module 修改文件
  • Maven常见问题、异常、错误整理【持续更新】

    前言 之前也写过一篇与Maven相关的文章 这是第二篇对于Maven常见问题 常见异常的整理 开一篇新的文章一个原因是自己更换了新的IDE 之前使用myEclipse 现在换成IDEA 更重要的原因是新的文章对于处理Maven这类错误的方案
  • 如何调用同文件夹的py文件

    你可以使用 import 语句来调用同文件夹中的另一个 Python 文件 举个例子 假设你有一个文件夹 里面有两个 Python 文件 main py 和 helper py 你想在 main py 中调用 helper py 中的函数
  • 用pycharm+flask 建立项目以后运行出现ImportError: No module named flask-login问题

    出现此问题 一般情况下 打开CMD输入 pip install flask login 然后 在cmd中输入命令 pip list 查看目前已安装的的模板 在此时 如果你继续运行项目 有可能会发现问题已经解决 但是也有可能会发现问题依然存在
  • Rust中的iter(), into_iter(), iter_mut()

    在Rust中 iter into iter iter mut 都是用于在集合类型上创建迭代器的方法 这三个方法各有不同 下面一一进行介绍 iter iter 方法创建一个不可变的引用迭代器 当你只想读取集合中的元素 而不想改变它们或消耗集合