Rust 在取消引用时会自动实现克隆吗?

神楽坂*_*坂深海 4 rust

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

impl Copy for Point {}

impl Clone for Point {
    fn clone(&self) -> Point {
        *self
    }
}
Run Code Online (Sandbox Code Playgroud)

当我只实现时Copy,Rust 告诉我需要实现Clone。当我只实现时Clone,Rust 告诉我Point可以移动。

我的问题是,我从来没有实现过任何东西,这段代码有点像循环依赖,但它有效吗?为什么?

mca*_*ton 7

TL;DR:Copy为了Clone方便起见,通常使用副本来实现类型CloneCopy

\n
\n

Rust 编译器通常必须对数据进行按位复制。但有两种情况:

\n
    \n
  • 如果类型未实现Copy则原始实例不再可用,您的数据已移动
  • \n
  • 如果该类型确实实现了Copy,则编译器知道继续将原始实例与新实例一起使用是完全安全的。
  • \n
\n

Copy特征不会改变编译器只会自动执行按位复制的事实:它是一个没有方法的标记特征。它的工作只是告诉编译器 \xe2\x80\x9cit 在按位复制 \xe2\x80\x9d 后可以继续使用它。

\n

这个Clone特征并没有那么特别:它是一个常规特征,具有可以做任何你想做的事情的方法。编译器从不Clone自动使用该特征,也不关心它实际做什么。然而,它显然是为了创建实例的克隆,因此以下行为是完全正常的:

\n
    \n
  • 期望Copy类型实现Clone。毕竟Copy是更严格的版本Clone。这就是为什么Copy: Clone你必须在类型Clone上实现Copy
  • \n
  • 期望Clone类型Copy是愚蠢的并且仅执行按位复制。你不会想要这里有两种不同的语义,那会很混乱。这就是为什么在您的示例中clone使用简单的实现: This dereferences ,这会导致按位复制。*selfself
  • \n
\n

然而,手动实现这些特征的情况很少见,大多数时候,您只需使用derive:

\n
#[derive(Copy, Clone, Debug)]\nstruct Point {\n    x: i32,\n    y: i32,\n}\n
Run Code Online (Sandbox Code Playgroud)\n