此代码无法编译:
fn main() {
let x = "".to_string();
let y = &x;
let z = *y;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误输出为:
无法移出
*y共享引用后面的内容发生 move 是因为
*y具有 typeString,但它没有实现该Copy特征
我不太清楚这里发生了什么并寻求解释。
我期待着z获得String和的所有权x并y变得无法使用。
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。
| 归档时间: |
|
| 查看次数: |
904 次 |
| 最近记录: |