1.Copy和Clone

Rust中的
Copy

Clone
trait都允许创建类型实例的副本。它们都提供了一种复制类型实例的方法,但它们之间存在一些重要的区别。了解这些区别有助更好地使用这两个特征。

2.
Copy
trait

Copy
trait允许按位复制类型的实例。这意味着当您将一个变量赋值给另一个变量时,如果该类型实现了
Copy
trait,则会创建一个新的副本。这与移动语义不同,其中原始变量不再可用。

要使用
derive
属性为类型自动生成
Copy
trait的实现,只需在类型定义之前添加
#[derive(Copy)]
即可。例如:

#[derive(Copy)]
struct Point {
x: i32,
y: i32,
}
复制代码

请注意,并非所有类型都可以实现
Copy
trait。例如,具有堆分配字段(如
String

Vec<T>
)的类型不能实现
Copy

3.
Clone
trait

与之相反,
Clone
trait提供了一个
clone
方法,用于创建类型实例的深层副本。这意味着即使类型具有堆分配字段(如
String

Vec<T>
),也可以实现
Clone
trait。

要为类型自动生成
Clone
trait的实现,只需在类型定义之前添加
#[derive(Clone)]
即可。例如:

#[derive(Clone)]
struct Point {
x: i32,
y: i32,
}
复制代码

但是,并非所有类型都可以使用
derive
属性自动生成
Clone
trait的实现。如果类型的某些字段没有实现

4.
Copy

Clone
trait之间的区别

尽管
Copy

Clone
trait都允许您创建类型实例的副本,但它们之间存在一些重要的区别。

首先,当您使用赋值语句复制一个实现了
Copy
trait的类型时,复制操作是隐式执行的。而当您使用
clone
方法复制一个实现了
Clone
trait的类型时,复制操作是显式执行的。 例如:

#[derive(Copy)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y);
}
复制代码
#[derive(Clone)]
struct Point {
x: i32,
y: i32,
}

fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1.clone();
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y);
}
复制代码

此外,这两个trait分别适用于不同的场景。对于那些具有简单按位复制语义的类型(如标量类型和由它们组成的数组和元组),使用
Copy
trait更为方便。而对于那些需要执行深层复制操作的类型(如具有堆分配字段的类型),则应使用
Clone
trait。from刘金,转载请注明原文链接。感谢!

标签: none

添加新评论