1.Copy和Clone

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

2. Copytrait

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

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

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

请注意,并非所有类型都可以实现Copytrait。例如,具有堆分配字段(如StringVec<T>)的类型不能实现Copy

3. Clonetrait

与之相反,Clonetrait提供了一个clone方法,用于创建类型实例的深层副本。这意味着即使类型具有堆分配字段(如StringVec<T>),也可以实现Clonetrait。

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

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

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

4. CopyClonetrait之间的区别

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

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

#[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分别适用于不同的场景。对于那些具有简单按位复制语义的类型(如标量类型和由它们组成的数组和元组),使用Copytrait更为方便。而对于那些需要执行深层复制操作的类型(如具有堆分配字段的类型),则应使用Clonetrait。from刘金,转载请注明原文链接。感谢!

Rust中的Copy和Clone的更多相关文章

  1. torch中的copy()和clone()

    torch中的copy()和clone() 1.torch中的copy()和clone() y = torch.Tensor(2,2):copy(x) ---1 修改y并不改变原来的x y = x:c ...

  2. datatable中的copy和clone的用法区分

    dt.copy();//复制结构和数据 dt.clone();//仅复制结构,不复制数据

  3. 以简单的例子谈一下C#中的COPY

    周五晚上加班的时候做一堆ComboBox直接的联动,然后呢,这些cbo的DataSource都是同一个DataTable,当时写代码的时候求快也就没有太注意DataTable的绑定,然后就出了一些小问 ...

  4. 【译】理解Rust中的局部移动

    原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partia ...

  5. C++中实现对象的clone()

    在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数 ...

  6. Rust 中的继承与代码复用

    在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...

  7. Objective-C中的copy协议

    NSObject对象是否可以copy自己 NSObject类没有实现NSCopying或者NSMutableCopying协议,但是却有copy以及mutableCopy实例方法.然而,如果用NSOb ...

  8. c#中命令copy已退出,返回值为1

    c#中命令copy已退出,返回值为1 本正经的道:董姐刚才你说的修心养性其中的'修心'我 有孕在身刚好由戴梦瑶顶替了她的位置按照的指示 ╋旆呆 湎术葶页 邾箕砜笳 烦璜卿廑 奶奶个腿儿的等下次非让你 ...

  9. OC中的copy

    copy的概念 Copy的字面意思是"复制"."拷贝",是一个产生副本的过程 对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容,常 ...

  10. Dockerfile 中的 COPY 与 ADD 命令

    Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景. Build 上下文的概念 在使用 docker ...

随机推荐

  1. Spring日志与SpringBoot日志

    本篇意为说明Spring默认日志实现与SpringBoot默认日志实现. 1.日志 在这之前,我们应该先了解一些日志框架. 具体可以看我这篇随笔:https://www.cnblogs.com/dai ...

  2. MariaDB简介

    一.什么是数据库 DB 与 DBMS :DB(DataBase)即数据库,存储已经组织好的数据的容器.DBMS(DataBase Manage System)是数据库管理系统用来对数据库及数据库中的数 ...

  3. 虚拟机文件丢失,虚拟机无法启动,通过xx-flat.vmdk和xx-delta.vmdk恢复虚拟机

    突然掉电,导致虚拟机文件夹里面的文件丢失,只剩余-flat.vmdk和-delta.vmdk文件,其他文件全部丢失,文件格式原本为"文件"格式.新建虚拟机无法直接使用此文件夹里面的 ...

  4. 2022.07.25 TypeScript基础类型介绍

    基础类型: 字符串(string)(String) let first: string = 'niu' // 直接赋值 let fourth: string = `niu` // 模板字符串 let ...

  5. OSPF RFC 1583 兼容

  6. Redis在线安装+三种启动方式(自启配置)

    ​ 1.下载 1)检查是否安装wget插件 $ wget --version ​ 2)如未安装,使用yum进行安装 $ yum install -y wget ​ 3)下载redis安装包 $ wge ...

  7. 查看服务器cpu 核心数

    cpu相关信息所在文件是 /proc/cpuinfo 物理cpu数 # grep "physical id" /proc/cpuinfo | sort | uniq | wc -l ...

  8. Spring简介-IOC

    目录 1.Spring 1.1.简介 1.2.优点 1.3.组成 1.4.扩展 2.IOC理论推导 1.Spring 1.1.简介 Spring:春天----------->给软件行业带来了春天 ...

  9. python pandas库总结-数据分析和操作工具

    参考:https://pandas.pydata.org/ Input/output相关函数 pandas.read_excel-将Excel文件读入pandas数据框 支持读取xls, xlsx, ...

  10. Linux0.11源码学习(一)

    Linux0.11源码学习(一) linux0.11源码学习笔记 参考资料:https://github.com/sunym1993/flash-linux0.11-talk 源码查看:https:/ ...