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

Rust代码编译报错E0502:不可变与可变借用冲突问题解析请求

Rust编译错误E0502原因解析

示例代码

fn f1<'a>(a: &'a String, b: &'a String) -> &'a String {
    a
}

fn f2<'a>(a: &'a mut String, b: &'a mut String) -> &'a mut String {
    b
}

fn main() {
    let mut a = "aaa".to_string();
    let mut b = "bbbbbbb".to_string();

    let c = f1(&a, &b);
    let d = f2(&mut a, &mut b);

    println!("{}", c);
    println!("{}", d);
}

编译错误信息

error[E0502]: cannot borrow `a` as mutable because it is also borrowed as immutable
  --> src/bin/main12.rs:16:16
   |
15 |     let c = f1(&a, &b);
   |                -- immutable borrow occurs here
16 |     let d = f2(&mut a, &mut b);
   |                ^^^^^^ mutable borrow occurs here
17 |
18 |     println!("{}", c);
   |                    - immutable borrow later used here

错误原因解释

这是Rust核心的引用规则冲突导致的:同一时间内,对同一个值不能同时存在不可变引用和可变引用。

具体到你的代码:

  • 第15行调用f1(&a, &b)时,对变量a创建了一个不可变引用,这个引用被绑定到变量c上。由于f1的泛型生命周期'a要求输入和返回的引用生命周期一致,c的生命周期会延续到它被使用的地方(第18行的println)。
  • 第16行调用f2(&mut a, &mut b)时,尝试对a创建可变引用,此时c还持有a的有效不可变引用,违反了Rust的引用规则,因此编译器抛出E0502错误。

修复方案

调整代码执行顺序,让不可变引用在创建可变引用之前就被使用完毕,这样编译器可以推断出不可变引用的生命周期已经结束:

fn f1<'a>(a: &'a String, b: &'a String) -> &'a String {
    a
}

fn f2<'a>(a: &'a mut String, b: &'a mut String) -> &'a mut String {
    b
}

fn main() {
    let mut a = "aaa".to_string();
    let mut b = "bbbbbbb".to_string();

    let c = f1(&a, &b);
    println!("{}", c); // 先使用c,结束不可变引用的生命周期

    let d = f2(&mut a, &mut b);
    println!("{}", d);
}

内容的提问来源于stack exchange,提问作者BaiTang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:45:25