You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:18:01