本内容是对 Rust开发干货集[1] 的实践与扩展.
iter() 不转移所有权
先简单解释下什么叫"转移所有权":
在 Rust 中,"转移所有权"(Ownership Transfer)是一种核心概念,它涉及变量和数据的所有权从一个实体转移到另一个实体。这种机制帮助 Rust 在编译时期管理内存安全,避免悬挂指针和内存泄漏等问题。
例如:
fn main() {
let s1 = String::from("hello");
let s2 = s1; // 所有权从 s1 转移到 s2
// println!("{}", s1); // 这行会引发编译错误,因为 s1 不再拥有数据的所有权. 报错: error[E0382]: borrow of moved value: `s1`
println!("{}", s2); // 正确,s2 现在拥有数据的所有权
}
当 s1 被赋值给 s2 时,s1 的所有权被转移给了 s2。这意味着 s1 不再有效,因此接下来如果使用 s1 将导致编译错误。
iter() 在 Rust 中用于创建集合的迭代器,比如在数组或向量上。iter() 不会转移集合的所有权。相反,它创建一个迭代器,该迭代器借用集合的内容:
fn main() {
let v = vec![1, 2, 3];
for i in v.iter() {
println!("{}", i);
}
// v 仍然有效,因为 iter() 没有取得所有权
println!("Vector: {:?}", v);
}
上例中,v.iter() 创建了一个迭代器,但 v 的所有权没有改变。因此,在迭代之后,仍然可以使用 v。
这说明iter() 不转移所有权(因为所有权转移意味着原始变量不再有效)
另外几种创建迭代器的方法: iter_mut() 和 into_iter()
iter_mut()
iter_mut() 方法用于创建一个可变借用(mutable borrow)的迭代器。其允许在迭代过程中修改集合中的元素。
(所有权并没有发生转移)
如下:
fn main() {
let mut v = vec![1, 2, 3];
for i in v.iter_mut() {
*i *= 2; // 将每个元素乘以 2
println!("{}", i);
}
println!("{:?}", v); // 输出: [2, 4, 6]
}
v.iter_mut() 创建了一个可变迭代器,允许修改向量 v 中的每个元素
into_iter()
into_iter() 方法用于创建一个取得所有权(ownership)的迭代器---这意味着迭代器会消耗(consume)集合,并拥有其元素的所有权。这通常用于在迭代时转移集合中元素的所有权。
如下:
fn main() {
let v = vec![1, 2, 3];
for i in v.into_iter() {
println!("{}", i); // 打印每个元素
}
// println!("{:?}", v); // 这行会编译错误,因为 v 的所有权已经被移动; error[E0382]: borrow of moved value: `v`
}
v.into_iter() 创建了一个获取 v 所有权的迭代器。迭代后,v 不再有效,因为它的所有权已经被迭代器 into_iter() 消耗。

本文详细介绍了Rust编程语言中iter()、iter_mut()和into_iter()方法在所有权转移上的区别,以及cloned()方法的应用。重点讨论了map、fold和filter等消费器在处理集合时的用法,展示了如何在函数式编程中合理运用这些工具。
最低0.47元/天 解锁文章
50





