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

时间:2017-07-14 05:46:43

标签: 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");
}

3 个答案:

答案 0 :(得分:4)

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

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

重新借用一个可变指针会锁定你重新借用的指针。

答案 1 :(得分:4)

规则

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

这不是空间排除(可以对同一篇文章进行多次引用),而是时间排除

机制

为了强制执行此操作,&mut T不是Copy;因此呼吁:

test(mutable_reference);

应将引用移至test

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

test(&mut *mutable_reference);

如果您愿意,可以强制移动:

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

效果

重新借贷实质上只是借贷:

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

答案 2 :(得分:2)

我分析了test(mutable_reference)test(&mut *mutable_reference)之间MIR的差异。似乎后者只引入了额外的间接水平:

code comparison: left is test(mutable_reference), right is test(&mut *mutable_reference)

当您在函数调用中使用额外的取消引用时,它不会创建一个包含的可变引用;换句话说,它不会在函数调用之外产生任何实际差异。