引言
在 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);
特点:
保持原始集合的所有权 只能读取元素,不能修改 适合需要多次使用原始集合的场景
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); // 编译错误!
特点:
获取原始集合的所有权 可以修改元素值 适合需要消费原始集合的场景
如何选择?
使用
iter()
:
当你只需要读取元素 当你之后还需要使用原始集合
使用 into_iter()
:
当你需要获取元素的所有权 当你需要修改元素值 当你不再需要原始集合
总结
在 Rust 中,iter()
和 into_iter()
都是重要的迭代器方法,它们的主要区别在于所有权的处理:
iter()
不获取所有权,但只能读取into_iter()
获取所有权,可以修改
选择使用哪种方法主要取决于你的具体需求。理解这些差异对于编写高效且正确的 Rust 代码至关重要。
参考文章
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 编程指导。