Rust 为什么要创建一个对一个取消引用的可变引用的可变引用?

Rust 为什么要创建一个对一个取消引用的可变引用的可变引用?,rust,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

我知道你不允许在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");
}

内存中是否有多个可变指针指向同一位置?对


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


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

我分析了
测试(可变引用)
测试(&mut*可变引用)
之间的MIR差异。后者似乎只引入了一个额外的间接层次:


当您在函数调用中使用额外的解引用时,它不会创建一个可保存的可变引用;换句话说,它不会在函数调用之外造成任何实际差异。

规则

在任何时间点,对特定值只有一个可用的可变参考

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

机制

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

test(mutable_reference);
应将引用移动到
测试中

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

test(&mut *mutable_reference);
如果需要,您可以强制移动:

test({ let x = mutable_reference; x });
效果

再借款本质上就是借款:

  • mutable_reference
    只要存在未命名的临时可变引用(或从中借用的任何内容),就会被借用
  • 将未命名的临时可变引用移动到
    测试中
  • 在表达式的末尾,未命名的临时可变引用被销毁,因此,
    mutable_引用的借用
    结束