2.5.5 Copy 与重借用

译文 · 基于 Learning Rust

Copy 与重借用

原文链接: https://quinedot.github.io/rust-learning/st-reborrow.html

共享引用(&T)实现了 Copy,这使它们非常灵活。一旦拥有一个,你就可以拥有任意多个;一旦对外暴露了一个,你就无法追踪还有多少个。

独占引用(&mut T)不实现 Copy。 相反,你可以通过一种称为*再借用(reborrowing)*的机制方便地使用它们。例如:

1
2
3
4
fn foo<'v>(v: &'v mut Vec<i32>) {
    v.push(0);         // 第 1 行
    println!("{v:?}"); // 第 2 行
}

在第 1 行把 v: &mut Vec<i32> 传给 push 时,你并没有移动它,否则第 2 行就无法打印 v。 但你也没有复制它,因为 &mut _ 不实现 Copy。 相反,*v 被再借用为一个比 'v 更短的生命周期,该生命周期在第 1 行结束。

显式的再借用看起来像这样:

1
2
3
4
# fn foo<'v>(v: &'v mut Vec<i32>) {
    Vec::push(&mut *v, 0);
#   println!("{v:?}");
# }

在再借用 &mut *v 存在期间不能使用 v,但它「过期」之后,又可以继续使用 v。 这样,两个 &mut 仍然是独占借用。

尽管文档严重不足,再借用正是让 &mut 可用的关键;Rust 中有大量隐式再借用。 再借用使 &mut T 在某些方面表现得像可 Copy 的 &T。但 &mut T 存在时必须独占,这导致它灵活得多。

再借用本身是个大话题,但你至少应理解它的存在,以及它如何让 Rust 在仍能保证内存安全的同时保持可用与 ergonomic。

最后修改 August 23, 2026: 更新 (499855b16)