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

为何我的Rust代码允许存在多个可变借用?

为何我的Rust代码允许存在多个可变借用?

嘿,这个问题问得特别好!我刚仔细看了你的代码,其实它并没有违反Rust的可变借用规则——核心原因是你的两个可变借用并没有在同一时间处于活跃状态,这要归功于Rust的「非词法生命周期(NLL)」特性,它让借用检查器变得更聪明了。

先把你的代码贴出来方便分析:

fn main() { 
    let mut s1 = String::from("Hello"); 
    update_str(&mut s1); 
    print!("{}", s1); 
    let s2 = &mut s1; 
    print!("{}", s2); 
    let s3 = &mut s1; 
    print!("{}", s3); 
} 

fn update_str(s: &mut String) { 
    s.push_str("World"); 
}

咱们一步步拆解:

  • 首先看update_str的调用:这里创建的s1可变借用,在函数执行完毕后就立刻被释放了——因为函数内部用完这个引用后,外部也没有再持有它,所以完全没问题。
  • 再看s2:你创建它之后,只在紧接着的print!("{}", s2);里用了一次,之后就再也没碰过它了。Rust的NLL会自动分析出,s2的借用生命周期在它最后一次被使用的地方就结束了,而不是等到整个代码块结束。
  • 所以当你创建s3的时候,s2的借用已经被彻底释放了,s1此时是“干净”的,完全可以被再次可变借用,这完全符合Rust的借用规则。

为了让你更清楚,我举个反例:如果在创建s3之后还试图使用s2,那Rust的借用检查器会立刻报错,因为这时候两个可变借用的活跃期重叠了:

fn main() { 
    let mut s1 = String::from("Hello"); 
    let s2 = &mut s1; 
    let s3 = &mut s1; // 这里直接编译错误:无法同时借用 `s1` 作为可变引用
    print!("{}", s2); 
    print!("{}", s3); 
}

总结一下:Rust的规则是「同一时间不能有多个活跃的可变借用」,而NLL特性让编译器能精准判断每个借用的实际活跃范围,而不是死板地按照代码块来划分。你的代码里两个可变借用的活跃期是完全错开的,所以编译自然能通过啦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:18:04