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

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

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

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

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

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

    rust 复制代码
    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() 返回的迭代器将生成集合中每个元素的可变引用。

    rust 复制代码
    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() 的示例:

rust 复制代码
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

相关推荐
catchadmin8 分钟前
使用 PHP 和 WebSocket 构建实时聊天应用 完整指南
开发语言·websocket·php
我命由我1234525 分钟前
Java 开发问题:包名 ‘com.my.compressimagetest‘ 与同名的类发生冲突
java·开发语言·学习·java-ee·intellij-idea·学习方法·intellij idea
APIshop29 分钟前
用第三方爬虫调用「淘宝评论 API」全流程实战
开发语言·爬虫
⑩-30 分钟前
Sleep与Wait的区别
java·开发语言
程序员阿鹏31 分钟前
List和Set的区别
java·开发语言·数据结构·后端·list
郑州光合科技余经理33 分钟前
技术解析:如何打造适应多国市场的海外跑腿平台
java·开发语言·javascript·mysql·spring cloud·uni-app·php
Source.Liu34 分钟前
【Rust】浮点数详解
rust
全栈陈序员1 小时前
【Python】基础语法入门(二十四)——文件与目录操作进阶:安全、高效地处理本地数据
开发语言·人工智能·python·学习
是有头发的程序猿1 小时前
Python爬虫实战:面向对象编程构建高可维护的1688商品数据采集系统
开发语言·爬虫·python
lkbhua莱克瓦241 小时前
多线程综合练习3
java·开发语言·多线程·githup