Rust中为何可同时存在两个可变引用?如下代码为何能正常编译?
Rust重借用机制与编译合法性解释
你提到的这段代码:
fn main() { let mut x = vec![1, 2, 3]; let y = &mut x; let z: &mut _ = y; let xx = y; }
可以正常编译,且完全没有违反Rust的核心借用原则,核心逻辑如下:
- 首先明确Rust可变借用的核心规则:同一时间,同一个值只能存在一个活跃的可变引用,注意规则的约束对象是「活跃的引用」,不是所有声明过的引用。
- 代码里
let z: &mut _ = y;确实发生了重借用(reborrow):本质是从已有的可变引用y上,临时借出一个新的可变引用z,Rust会自动保证z的生命周期严格短于y的生命周期,z活跃期间y会被暂时冻结,无法被访问。 - 这段代码的特殊点在于:
z声明后没有任何地方被使用,Rust编译器的生命周期分析会直接判定z在声明完成后就立刻结束生命周期,y的冻结状态同步解除,因此后续let xx = y;可以正常移动y的所有权,不会产生引用冲突。
你可以做个简单测试:在let z: &mut _ = y;之后加一行z.push(4);,放在let xx = y;之前,编译器就会抛出借用冲突错误,因为此时z的生命周期还未结束,y仍处于冻结状态,无法被访问。
重借用机制本身就是Rust为了提升可变引用的使用灵活性设计的特性,全程都在借用规则的约束下运行,任何时间点都只会有一个活跃的可变引用可以访问原始值,不会出现同时多个可变引用操作同一个值的情况,完全符合安全要求。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

