为什么Rust允许2个同时可变引用?
锈书说
“对于特定范围内的特定数据,您只能有一个可变引用”
据我所知,以下工作代码通过同时具有 2 个可变引用与此相矛盾:
fn main() {
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
}
代码只是对本书中的这个例子稍作修改:
fn main() {
let mut s = String::from("hello");
{
let r1 = &mut s;
} // r1 goes out of scope here, so we can make a new reference with no problems.
let r2 = &mut s;
}
这本书暗示只能进行第二个可变引用,因为第一个超出范围,但是当我修改代码以使第一个引用不会超出范围时,它仍然可以编译。为什么这是允许的?我认为 Rust 一次只能允许 1 个可变引用。
回答
r1 仍在范围内,但您将无法使用它。那是因为它借了 s. 但是一旦r2借了,r1就不能再用了。
例如,尝试添加
dbg!(r1);
你应该得到一个错误:
|
15 | let r1 = &mut s;
| ------ first mutable borrow occurs here
16 | let r2 = &mut s;
| ^^^^^^ second mutable borrow occurs here
17 |
18 | dbg!(r1);
| -- first borrow later used here