#[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
可以移动。
我的问题是,我从来没有实现过任何东西,这段代码有点像循环依赖,但它有效吗?为什么?
TL;DR:Copy
为了Clone
方便起见,通常使用副本来实现类型Clone
。Copy
Rust 编译器通常必须对数据进行按位复制。但有两种情况:
\nCopy
则原始实例不再可用,您的数据已移动。Copy
,则编译器知道继续将原始实例与新实例一起使用是完全安全的。该Copy
特征不会改变编译器只会自动执行按位复制的事实:它是一个没有方法的标记特征。它的工作只是告诉编译器 \xe2\x80\x9cit 在按位复制 \xe2\x80\x9d 后可以继续使用它。
这个Clone
特征并没有那么特别:它是一个常规特征,具有可以做任何你想做的事情的方法。编译器从不Clone
自动使用该特征,也不关心它实际做什么。然而,它显然是为了创建实例的克隆,因此以下行为是完全正常的:
Copy
类型实现Clone
。毕竟Copy
是更严格的版本Clone
。这就是为什么Copy: Clone
你必须在类型Clone
上实现Copy
。Clone
类型Copy
是愚蠢的并且仅执行按位复制。你不会想要这里有两种不同的语义,那会很混乱。这就是为什么在您的示例中clone
使用简单的实现: This dereferences ,这会导致按位复制。*self
self
然而,手动实现这些特征的情况很少见,大多数时候,您只需使用derive
:
#[derive(Copy, Clone, Debug)]\nstruct Point {\n x: i32,\n y: i32,\n}\n
Run Code Online (Sandbox Code Playgroud)\n