无法移动到共享引用后面

TSK*_*TSK 5 rust

此代码无法编译:

fn main() {
    let x = "".to_string();
    let y = &x;
    let z = *y;
}
Run Code Online (Sandbox Code Playgroud)

编译器错误输出为:

无法移出*y共享引用后面的内容

发生 move 是因为*y具有 type String,但它没有实现该Copy特征

我不太清楚这里发生了什么并寻求解释。

我期待着z获得String和的所有权xy变得无法使用。

Fin*_*nis 3

let z = *y;
Run Code Online (Sandbox Code Playgroud)

这条线只知道y,并且y是一条&String&String不携带任何来自何处的信息,它只携带它是对 的引用的信息String。它不知道也不关心包含实际内容的事实x,也没有对 的任何控制x,除了借用检查器确保x保持在范围内且不可变这一事实之外。

So*y实际上并不产生x,而是一个String只能通过引用访问的匿名值,这意味着它可以使用,但不能拥有。

通过这样做z = *y,您正在尝试拥有引用背后的值。但正如我所说,这需要修改x(因为它之后不再有效),并且y没有权力x. 所以这是不可能的。

因为z = *y对于可复制类型来说这样做不会有问题,因为它们不需要所有权转移而只是被复制,Rust 告诉您这是不可能的,因为引用的值y没有实现Copy