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
相关产品推荐
相关产品推荐

