为什么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


以上是为什么Rust允许2个同时可变引用?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>