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

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()
    • 当你只需要读取元素
    • 当你之后还需要使用原始集合
  2. 使用 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

来源:数据科学研习社

THE END