为什么`& mut& foo`有效,但`& mut a_ref_to_foo`无效?

时间:2017-06-01 16:21:12

标签: rust

在以下示例中,t1编译,但t2不编译。

&mut &stream有什么特别之处吗?我认为不会Deref开始。

use std::net::TcpStream;

fn t1() {
    let stream = TcpStream::connect("127.0.0.1").unwrap();
    let a = &mut &stream;
}

fn t2(stream: &TcpStream) {
    let a = &mut stream;
}

Playground

9  | fn t2(stream: &TcpStream) {
   |       ------ use `mut stream` here to make mutable
10 |     let a = &mut stream;
   |                  ^^^^^^ cannot borrow mutably

1 个答案:

答案 0 :(得分:5)

&mut &foo

这有两件事 - 它创建一个&Foo类型的临时值,然后创建另一个&mut &Foo类型的临时值。

let a_ref_to_foo = &foo;
&mut a_ref_to_foo

这也创建了&mut &Foo类型的临时格式,但是通过变量绑定a_ref_to_foo不是另一个临时值可以观察到的东西。

问题与此示例相同:

// Works
String::new().clear();

// Doesn't work
let s = String::new();
s.clear();

当您拥有临时值时,您拥有它的所有权,包括将其视为可变。一旦将其分配给绑定,绑定就拥有所有权,您必须指明它是否允许变异。