Rust 迭代器:iter() 和 into_iter() 的使用区别详解

文摘   科技   2024-11-10 08:27   四川  

引言

在 Rust 编程中,迭代器是一个非常重要的概念。它允许我们以简洁的方式遍历、转换和过滤复杂的数据结构。今天,我们就来深入了解两个常用的迭代器方法:iter()into_iter()

迭代器简介

迭代器是一个允许我们按顺序访问集合中元素的对象。在 Rust 中,迭代器具有惰性求值的特性,也就是说在使用 for 循环或 collect 等方法消费它们之前,不会执行任何操作。

iter() 的使用

iter() 方法创建一个不可变引用的迭代器。让我们看一个例子:

let names = vec!["Java""Rust""Python"];
let mut total_length = 0;

// 使用 iter() 遍历vector中的元素
for name in names.iter() {
    total_length = total_length + name.len();
}

// 验证总长度是否正确
assert_eq!(14, total_length);

// 可以继续使用names,因为iter()不会获取所有权
println!("{:?}", names);

特点:

  1. 保持原始集合的所有权
  2. 只能读取元素,不能修改
  3. 适合需要多次使用原始集合的场景

into_iter() 的使用

into_iter() 方法会获取集合的所有权。看下面的例子:

let names = vec!["Java""Rust""Python"];
let mut total_length = 0;

// 使用 into_iter() 遍历并获取所有权
for mut name in names.into_iter() {
    // 可以修改值,因为已经获得所有权
    name = "C++";
    total_length = total_length + name.len();
}

// 下面的代码会报错,因为names的所有权已经被转移
// println!("{:?}", names);  // 编译错误!

特点:

  1. 获取原始集合的所有权
  2. 可以修改元素值
  3. 适合需要消费原始集合的场景

如何选择?

  1. 使用 iter()

  • 当你只需要读取元素
  • 当你之后还需要使用原始集合
  • 使用 into_iter()

    • 当你需要获取元素的所有权
    • 当你需要修改元素值
    • 当你不再需要原始集合

    总结

    在 Rust 中,iter()into_iter() 都是重要的迭代器方法,它们的主要区别在于所有权的处理:

    • iter() 不获取所有权,但只能读取
    • into_iter() 获取所有权,可以修改

    选择使用哪种方法主要取决于你的具体需求。理解这些差异对于编写高效且正确的 Rust 代码至关重要。

    参考文章

    1. Difference Between iter() and into_iter() in Rust:https://crustc.com/difference-iter-and-into_iter

    书籍推荐

    各位 Rust 爱好者,今天为大家介绍一本《Programming Rust: Fast, Safe Systems Development》(第二版) 是由 Jim Blandy、Jason Orendorff 和 Leonora Tindall 合著的 Rust 编程指南。本书深入探讨了 Rust 语言在系统编程中的应用,着重介绍如何利用 Rust 的独特特性来平衡性能和安全性。书中涵盖了 Rust 的基础数据类型、所有权和借用概念、特征和泛型、并发编程、闭包、迭代器以及异步编程等核心内容。这本更新版基于 Rust 2021 版本,为系统程序员提供了全面而实用的 Rust 编程指导。

    1.  Rust:横扫 C/C++/Go 的性能之王?

    2.  从 Rust 开发者视角看 C++:优缺点大揭秘

    3.  Rust vs Zig:新兴系统编程语言之争

    数据科学研习社
    带你走进数据科学的世界🚀
     最新文章