#[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 ,这会导致按位复制。*selfself然而,手动实现这些特征的情况很少见,大多数时候,您只需使用derive:
#[derive(Copy, Clone, Debug)]\nstruct Point {\n x: i32,\n y: i32,\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2986 次 |
| 最近记录: |