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

Rust编译报错E0502:无法不可变借用`var`,因已被可变借用

Rust编译错误E0502深度解析

报错信息

error[E0502]: cannot borrow var as immutable because it is also borrowed as mutable

问题代码

fn increment(num : &mut i32){
    *num = *num +1;
}

fn main() {
    let mut var : i32 = 123;
    let p_var: &mut i32   = &mut var;

    println!("{}", var);
    increment(p_var);
}

错误原因

这是Rust所有权与借用规则的核心限制导致的,规则核心是:

  • 同一时间,一个值只能存在一种借用状态:要么有且仅有一个可变借用,要么有任意多个不可变借用,两者绝对不能共存。
  • 借用的有效期从创建开始,直到该借用变量不再被使用(或超出作用域销毁)为止。

回到代码的执行逻辑:

  1. 我们创建了可变变量var,接着通过&mut var创建了它的可变借用p_var。从这一刻起,var的访问权限被Rust锁定——只要p_var还存在(未被销毁或未结束使用),任何对var的其他借用(包括不可变借用)都会被禁止。
  2. 接下来的println!("{}", var)尝试直接读取var的值,这会隐式创建一个var的不可变借用。但此时var已经被p_var可变借用了,两种借用状态冲突,编译器直接抛出E0502错误。

哪怕后续代码里调用increment(p_var)会使用这个可变借用,但问题出在println这一步——只要可变借用p_var的生命周期还没结束,var就不能被以任何其他方式借用。

修复方案

方案1:调整顺序,先使用可变借用再访问原变量

把increment(p_var)移到println之前,这样可变借用p_var被使用完毕后,Rust会自动释放var的借用限制:

fn increment(num : &mut i32){
    *num = *num +1;
}

fn main() {
    let mut var : i32 = 123;
    let p_var: &mut i32   = &mut var;

    increment(p_var);
    println!("{}", var);
}

方案2:缩小可变借用的作用域

用花括号将可变借用的代码包裹起来,让p_var在执行println之前就超出作用域被销毁,主动结束可变借用:

fn increment(num : &mut i32){
    *num = *num +1;
}

fn main() {
    let mut var : i32 = 123;

    {
        let p_var: &mut i32   = &mut var;
        increment(p_var);
    }

    println!("{}", var);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:27:32