2

我正在阅读 Rust 书,它在第 4.2 节中说了以下内容:

在任何给定时间,您都可以拥有一个可变引用或任意数量的不可变引用。

但是,我在试验中发现实际上我可以在同一范围内拥有多个可变引用,而无需使用任何不安全的代码:

fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(ir);
    *ir2 = 2;
    println!("{}", *ir);
}

输出:

2

这里发生了什么?Rust 书是否过于简化了事情?有没有比 Rust 书更好的针对没有经验的 Rust 程序员的 Rust 借用检查器的信息来源?

4

1 回答 1

1

可变引用是非的Copy,所以在你传递ir给它之后,make_mut它被移动并且不再存在:

fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(ir);
    *ir = 3; // error here
    *ir2 = 2;
    println!("{}", *ir);
}

在您的特定情况下,重新借用发生在ir; 这就是 Rust 修改代码的方式:

fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(&mut *ir); // rust replaces raw `ir` with reborrowed mutable reference to dereferenced `ir`
    *ir2 = 2;
    println!("{}", *ir);
}

如果您尝试同时使用两个可变引用,仍然会出现编译错误。

于 2021-04-06T19:06:53.853 回答