从rust book人起:
在任何给定时间,您可以有一个可变引用,也可以有任意数量的不可变引用.
请考虑以下代码:
fn main() {
let mut a = 41;
let b = &mut a;
let c: &i32 = &a; // [1]
let d: &i32 = &b;
println!("{} {}", b, c); // [2]
println!("{} {}", b, d);
}
如果我们try 编译,我们会得到:
error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
--> src\main.rs:43:19
|
42 | let b = &mut a;
| ------ mutable borrow occurs here
43 | let c: &i32 = &a; // [1]
| ^^ immutable borrow occurs here
44 | let d: &i32 = &b;
| -- mutable borrow later used here
...因此,关于只有一个可变引用的规则是成立的.
但是,如果您对标记为[1]
和[2]
的行进行注释,则一切都可以正常编译.请注意,在这种情况下,b
是可变引用,而d
是不可变引用(似乎与c
相同).
为什么我们允许这种情况,为什么这个用例在编译时没有违反关于拥有一个可变引用或n个不可变引用的规则?