为什么我可以在不使用不安全代码的情况下获得对 Rust 中变量的多个可变引用?

Why can I get multiple mutable references to a variable in Rust without using unsafe code?

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

At any given time, you can have either one mutable reference or any number of immutable references.

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

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 程序员?

可变引用是非 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);
}

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