在下面的示例中,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;
}
9 | fn t2(stream: &TcpStream) {
| ------ use `mut stream` here to make mutable
10 | let a = &mut stream;
| ^^^^^^ cannot borrow mutably
最佳答案
&mut &foo
这做了两件事 - 它创建了一个类型为 &Foo
的临时值,然后创建了另一个类型为 &mut &Foo
的临时值。
let a_ref_to_foo = &foo;
&mut a_ref_to_foo
这也创建了一个 &mut &Foo
类型的临时变量,但是通过变量绑定(bind) a_ref_to_foo
可以观察到的东西,不是另一个临时变量。
问题和这个例子是一样的:
// Works
String::new().clear();
// Doesn't work
let s = String::new();
s.clear();
当您拥有一个临时值时,您就拥有它的所有权,包括将其视为可变的。一旦将其分配给绑定(bind),绑定(bind) 便拥有所有权,您必须指明是否允许对其进行更改。
关于rust - 为什么 `&mut &foo` 有效但 `&mut a_ref_to_foo` 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312652/