rust语言学习笔记Trait(一)Copy、Clone(拷贝)
Copy浅拷贝
- 适用于纯栈上、无堆资源的小型类型
- 按位复制,仅复制栈上字节,性能开销极低
- 标记
trait,无方法,使用时赋值、传参自动触发 - 实现
Copy必须同时实现Clone,不能与Drop共存 - 优先使用 Copy 的场景:
- 类型仅由基本数值、布尔、字符等组成,且大小固定(如
Point、Color)。 - 需要频繁传递但不想增加
.clone()调用的心智负担。 - 对性能敏感,希望编译器自动优化为按位复制。
- 类型仅由基本数值、布尔、字符等组成,且大小固定(如
Clone深拷贝
适用于几乎所有类型
复制堆数据,涉及堆分配,性能开销大
普通
trait,有clone()方法,使用时需要显式调用clone()方法独立 trait,不要求
Copy,可与Drop共存必须使用 Clone 的场景:
类型包含
String、Vec<T>、Box<T>等堆分配字段。需要一份完全独立的副本,修改副本不影响原数据。
类型实现了
Drop,有自定义清理逻辑。需要定制复制过程(例如深拷贝图结构、增加引用计数)。
Copy的使用
1、基本类型直接使用Copy
let x = 5; let y = x; // 自动复制,x 未被移动2、纯栈上结构体派生Copy
// Copy 只能用于简单类型(所有字段都是 Copy)#[derive(Debug, Clone, Copy)]// 必须同时派生 Clone,因为 Copy trait 的定义要求 Copy: ClonestructPoint{x:i32,y:i32,}letpt1=Point{x:3,y:4};letpt2=pt1;// Copy 自动发生,不用 clone()println!("{:?}",pt1);// ✅ pt1 还能用(因为是 Copy)Clone的使用
1、标准库类型使用clone()克隆
lets1=String::from("hello");lets2=s1.clone();2、结构体派生Clone
#[derive(Debug, Clone)]structPerson{name:String,}fnmain(){letp1=Person{name:"张三".to_string(),};letp2=p1.clone();// 显式克隆println!("{:?}",p1);// ✅ p1 还能用}3、手动实现Clone
#[derive(Debug)]structCounter{id:i32,count:i32}implCloneforCounter{fnclone(&self)->Self{Counter{id:self.id,count:0}// 克隆时重置计数器,非复制原值}}fnmain(){letc1=Counter{id:5,count:88};letc2=c1.clone();println!("{:?}",c1);// Counter { id: 5, count: 88 }println!("{:?}",c2);// Counter { id: 5, count: 0 }}