Rust编译报错E0502:无法不可变借用`var`,因已被可变借用
Rust编译错误E0502深度解析
报错信息
error[E0502]: cannot borrow
varas 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所有权与借用规则的核心限制导致的,规则核心是:
- 同一时间,一个值只能存在一种借用状态:要么有且仅有一个可变借用,要么有任意多个不可变借用,两者绝对不能共存。
- 借用的有效期从创建开始,直到该借用变量不再被使用(或超出作用域销毁)为止。
回到代码的执行逻辑:
- 我们创建了可变变量
var,接着通过&mut var创建了它的可变借用p_var。从这一刻起,var的访问权限被Rust锁定——只要p_var还存在(未被销毁或未结束使用),任何对var的其他借用(包括不可变借用)都会被禁止。 - 接下来的
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
相关产品推荐
相关产品推荐

