fn main() {
let mut a = String::new();
let mut b = &mut a;
println!("{:?}",a);
b.push('a');
}
error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
--> src/main.rs:9:21
|
8 | let mut b = &mut a;
| ------ mutable borrow occurs here
9 | println!("{:?}",a);
| ^ immutable borrow occurs here
10 | b.push('a');
| - mutable borrow later used here
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
原因是a和b变量都指向同一个内存区域
a和b都对应同一个区域有write的权限。
println!("{:?}",a);这句话将对a进行不可变的借用
问题出在了10行。此行b是对a的一个可变借用。
第9行是对a的不可变借用,第10行是对a的可变借用。两者矛盾。编译报错。
同理是:
fn main() {
//
let rc = Rc::new(vec![1, 2, 3]);
// 创建一个共享引用
let mut rc_clone = Rc::clone(&rc);
// 此时的引用计数为2,`make_mut` 会在需要修改时进行克隆
// let mut binding = rc.clone();
let rc_mut = Rc::make_mut(&mut rc_clone);
// 现在可以安全地修改 `rc_mut`,原始的 `rc` 和 `rc_clone` 不受影响
rc_mut.push(4);
// println!("rc length: {:?}", Rc::strong_count(&rc));
println!("rc: {:?}", rc); // [1, 2, 3]
println!("rc_clone: {:?}", rc_clone); // [1, 2, 3]
// println!("rc_mut: {:?}", rc_mut); // [1, 2, 3, 4]
rc_mut.push(4);
}
rc_mut是对rc_clone的可变借用。
println!("rc_clone: {:?}", rc_clone);变成了对rc_clone的不可变借用
两者矛盾了。因此报错。
但是这里面Rc::make_mut(&mut rc_clone);调用结束了后,为什么还认为存在对rc_clone的可变借用呢?原因见chatgpt回答:
一个更简单的类似的例子是这个:
fn test(b :& String) {
println!("{:?}",b)
}
fn test2(b :&mut String) -> &mut String{
b.push('b');
println!("{:?}",b);
return b;
}
fn main() {
let mut a = String::new();
let c = test2(&mut a);
test(&a);
a.push('a');
c.push('b');
}
cannot borrow
a
as immutable because it is also borrowed as mutable 是什么错误,详细解释下