Rust中的Copy和Clone
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刘金,转载请注明原文链接。感谢!
Rust中的Copy和Clone的更多相关文章
- torch中的copy()和clone()
torch中的copy()和clone() 1.torch中的copy()和clone() y = torch.Tensor(2,2):copy(x) ---1 修改y并不改变原来的x y = x:c ...
- datatable中的copy和clone的用法区分
dt.copy();//复制结构和数据 dt.clone();//仅复制结构,不复制数据
- 以简单的例子谈一下C#中的COPY
周五晚上加班的时候做一堆ComboBox直接的联动,然后呢,这些cbo的DataSource都是同一个DataTable,当时写代码的时候求快也就没有太注意DataTable的绑定,然后就出了一些小问 ...
- 【译】理解Rust中的局部移动
原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partia ...
- C++中实现对象的clone()
在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数 ...
- Rust 中的继承与代码复用
在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...
- Objective-C中的copy协议
NSObject对象是否可以copy自己 NSObject类没有实现NSCopying或者NSMutableCopying协议,但是却有copy以及mutableCopy实例方法.然而,如果用NSOb ...
- c#中命令copy已退出,返回值为1
c#中命令copy已退出,返回值为1 本正经的道:董姐刚才你说的修心养性其中的'修心'我 有孕在身刚好由戴梦瑶顶替了她的位置按照的指示 ╋旆呆 湎术葶页 邾箕砜笳 烦璜卿廑 奶奶个腿儿的等下次非让你 ...
- OC中的copy
copy的概念 Copy的字面意思是"复制"."拷贝",是一个产生副本的过程 对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容,常 ...
- Dockerfile 中的 COPY 与 ADD 命令
Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景. Build 上下文的概念 在使用 docker ...
随机推荐
- sql server 计算时间差的一部分函数【转】
在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及GetDate()函数了.DATEDIFF ( datepart ...
- SQLServer 远程链接MySql数据库
第一步:安装MySQL odbc driver 在SQL SERVER所在主机上安装MYSQL ODBC Driver; 下载地址:http://dev.mysql.com/downloads/con ...
- 发布订阅清理distribution未执行导致distribution库特别大处理办法
近期发现数据服务器中数据库所在盘被占用的特别严重,一个800G的盘只剩下不到100G,排除备份所占用的其他的空间竟然有400G被安装目录下的分发数据库distribution.MDF所占用. 分发数据 ...
- 安装SQL Server 2008 R2出现的问题及解决方法(配合Visual Studio )
学校的一个作业需要SQL Server,所以就安装一个,没想到还真是有不少问题 总结:遇到问题,取消安装,完全删除(注册表啥的,小心,细心),重新安装. tips:彻底删除SQL Server应用及组 ...
- R grep
SAIN<-FAIN[grepl("HE-H$",FAIN$rDD),,drop=TRUE]
- WEB开发日志1
2020/6/11 23:23 今天做系统时,用到二级菜单,菜单下方放了一个<iframe>标签,但二级菜单的菜单项太多,导致一部分菜单项被<iframe>覆盖,从而无法再选中 ...
- 切片slice
1.切片 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制 切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样. 切片的长度是可以变化的, ...
- 从babel编译结果分析class的实现原理
示例: class A { // 属性表达式 prop1 = 1; // get方法 get value() { console.log('Getting the current value!'); ...
- ABAP 调用HTTP上传附件(二)之中文乱码
1.这篇文章的由来 之前已经发表了<ABAP 调用HTTP上传附件>的文章,详细介绍了如何通过HTTP请求传输附件,可点击链接参考原有文档 因为之前对传输文件的中文文件名处理上解释不够详细 ...
- DES算法流程
初始置换IP 表格的使用方法: 将输入的64bit的明文从1开始标号,依次放入到IP初始置换表中数字对应的位置.填充完毕后,按照行优先的顺序从第1行开始依次读取获得输出. 16轮轮结构 整体结构 因为 ...