为什么要创建一个对引用的可变参考工作的可变引用?

Pro*_*000 6 rust

我知道你不允许在Rust中同时创建两个对象的可变引用.我不完全理解为什么以下代码有效:

fn main() {
    let mut string = String::from("test");
    let mutable_reference: &mut String = &mut string;
    mutable_reference.push_str(" test");
    // as I understand it, this creates a new mutable reference (2nd?)
    test(&mut *mutable_reference);

    println!("{}", mutable_reference);
}

fn test(s: &mut String) {
    s.push_str(" test");
}
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 9

规则

在任何时间点都只能有一个对特定值的可用可变引用。

这不是空间排除(同一块可以有多个引用),而是时间排除

机制

为了强制执行这一点,&mut T不是Copy;因此呼吁:

test(mutable_reference);
Run Code Online (Sandbox Code Playgroud)

应该将引用移动到test.

实际上这样做会使其在以后无法使用并且不符合人体工程学,因此 Rust 编译器会插入一个自动reborrowing,就像您自己做的那样:

test(&mut *mutable_reference);
Run Code Online (Sandbox Code Playgroud)

如果您想,您可以强制移动:

test({ let x = mutable_reference; x });
Run Code Online (Sandbox Code Playgroud)

效果

再借,本质上就是借:

  • mutable_reference 只要未命名的临时可变引用存在(或从它借用的任何东西),就会被借用,
  • 未命名的临时可变引用移入test
  • 在 of 表达式中,未命名的临时可变引用被销毁,因此借用了mutable_reference结束。


DK.*_*DK. 6

内存中某处是否有多个可变指针指向同一位置?是的。

代码中是否有多个可变指针指向可用的同一位置?不。

重新借用可变指针会锁定您要重新借用的指针。