我知道字符串没有实现Copy特征.所以它不能被移动.但我不能理解以下两者之间的区别,

let greeting = String::from("Hello");
let temp = greeting; // This succeeds.

let greeting1 = String::from("Hello");
let temp1 = *&greeting1; // This fails to compile saying cannot move. 

它们之间有什么不同?为什么一个是有效的,另一个是无效的?

推荐答案

我知道String没有实现Copy的特性.所以它不能被移动.

这并不是真的正确-所有类型的值都可以移动,但您需要是所有者才能移动某些东西.例如,如果您编写一个返回类型为String的函数,则当您从该函数返回值时,您正在将其移动(到调用方).

Copy与此相关,因为实现Copy的类型允许您隐式地将共享引用转换为拥有的副本,然后允许您移动该副本(因为您拥有它).

它们之间有什么不同?为什么一个是有效的,另一个是无效的?

&greeting1创建对该字符串的共享引用;String值不属于该引用.所以*&greeting1是一个你不拥有的String类型的值,你不能用它做任何需要所有权的事情.

Rust相关问答推荐

如何在rust中有条件地分配变量?

基于对vec值的引用从该值中删除该值

Rust kill std::processs::child

如何创建引用构造函数拥有的变量的对象?

MutexGuard中的过滤载体不需要克隆

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

取得本地对象字段的所有权

失真图像图形捕获Api

链表堆栈溢出

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

如何在 Rust 中将枚举变体转换为 u8?

为什么不可变特征的实现可以是可变的?

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

如何在 C++ 和 Rust 之间共享 pthread 同步原语?

Rust 跨同一文件夹中文件的可见性

在 Rust 中组合特征的不同方法是否等效?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

为什么 `ref` 会导致此示例*取消引用*一个字段?

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