此代码不能编译:

fn main() {
    let x = "".to_string();
    let y = &x;
    let z = *y;
}

编译器错误输出为:

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

之所以发生移动,是因为*y具有类型String,该类型不实现Copy特征

我不太清楚这里发生了什么,我正在寻找一个解释.

我原以为会有z人拥有Stringx,而y会变得无法使用.

推荐答案

let z = *y;

这条线只知道y,而y&String.&String没有携带任何它来自哪里的信息,它只携带了它引用String的信息.它既不知道也不关心x包含实际内容这一事实,也不对x有任何控制,只是borrow 判断器确保x保持在作用域内且不可变.

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

通过做z = *y,你就是在试图拥有引用背后的价值.但正如我所说的,这将需要修改x(因为它以后不再有效),而y没有超过x的权力.所以这是不可能的.

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

Rust相关问答推荐

将此字符串转换为由空格字符分隔的空格

通过解引用将值移出Box(以及它被脱糖到什么地方)?

当T不执行Copy时,如何返回Arc Mutex T后面的值?

我应该将哪些文件放入我的GitHub存储库

应为关联类型,找到类型参数

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

Rust Axum 框架 - 解包安全吗?

Rust 中的生命周期:borrow 的 mut 数据

内部值发生变化时 Rc 的行为

打印 `format_args!` 时borrow 时临时值丢失

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

强制特征仅在 Rust 中的给定类型大小上实现

如何在 Rust Polars 中可靠地连接 LazyFrames

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

实现不消费的迭代器

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器

返回引用的返回函数

为什么在使用 self 时会消耗 struct 而在解构时不会?

在 macro_rules 中转义 $ 美元符号