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

相关推荐
范特西林1 天前
一次 to_bits() 引发的 Rust 与 C++ 底层思考
rust
冬奇Lab2 天前
一天一个开源项目(第42篇):OpenFang - 用 Rust 构建的 Agent 操作系统,16 层安全与 7 个自主 Hands
人工智能·rust·开源
量子位2 天前
Transformer论文作者重造龙虾,Rust搓出钢铁版,告别OpenClaw裸奔漏洞
rust·openai·ai编程
哈里谢顿2 天前
Rust 语言入门博客
rust
DongLi014 天前
rustlings 学习笔记 -- exercises/06_move_semantics
rust
ssshooter4 天前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
布列瑟农的星空4 天前
前端都能看懂的rust入门教程(二)——函数和闭包
前端·后端·rust
蚂蚁背大象5 天前
Rust 所有权系统是为了解决什么问题
后端·rust
布列瑟农的星空5 天前
前端都能看懂的rust入门教程(五)—— 所有权
rust
Java水解6 天前
Rust嵌入式开发实战——从ARM裸机编程到RTOS应用
后端·rust