rust 的Clone

ops/2025/3/16 8:57:07/

Clone 是 Rust 编程语言中一个核心特质(trait), 定义了类型如何安全、明确地创建其值的深拷贝(deep copy)。

下面用实例来演示Clone的作用,先看一下如下的代码,注意此代码编译不过。

rust">#[derive(Debug)]
struct Item{value: i32,
}fn main() {let a = Item{value:7};let b = a;println!("value a {:?}, value b {:?}", a, b);
}

编译报错:

cargo run

error[E0382]: borrow of moved value: `a`
  --> src/main.rs:10:44
   |
8  |     let a = Item{value:7};
   |         - move occurs because `a` has type `Item`, which does not implement the `Copy` trait
9  |     let b = a;
   |             - value moved here
10 |     println!("value a {:?}, value b {:?}", a, b);
   |                                            ^ value borrowed here after move
   |
note: if `Item` implemented `Clone`, you could clone the value
  --> src/main.rs:3:1
   |
3  | struct Item{
   | ^^^^^^^^^^^ consider implementing `Clone` for this type
...
9  |     let b = a;
   |             - you could clone this value
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0382`.
 

 报错的意思是变量a的所有权已经被移动到b,所以println!无法再使用a。

如果要想Item类的变量赋值后所有权继续有效,就需要Item类实现clone()。

方案一:手动为Item类实现trait Clone

rust">#[derive(Debug)]
struct Item{value: i32,
}impl Clone for Item{fn clone(&self) -> Self{Item { value: self.value, }}
}fn main() {let a = Item{value:7};let b = a.clone();println!("value a {:?}, value b {:?}", a, b);
}

 编译运行:

     Running `target\debug\greeting.exe`
value a Item { value: 7 }, value b Item { value: 7 }

方案二:

使用属性(Attribute)

rust">#[derive(Debug, Clone)]
struct Item{value: i32,
}fn main() {let a = Item{value:7};let b = a.clone();println!("value a {:?}, value b {:?}", a, b);
}

编译运行

Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
     Running `target\debug\greeting.exe`
value a Item { value: 7 }, value b Item { value: 7 }


http://www.ppmy.cn/ops/166168.html

相关文章

ThreadLocal使用陷阱详解

引言 ThreadLocal是Java中实现线程隔离的一个重要工具,它为每个线程提供了独立的变量副本。但在使用过程中,如果不注意一些细节,很容易踩坑。本文将详细介绍ThreadLocal使用过程中的常见陷阱及其解决方案。 1. 内存泄漏问题 1.1 问题描述 …

H3C无线控制器二层注册典型配置举例

介绍AP与AC间通过二层网络完成注册的配置举例 组网需求 如图所示,集中式转发架构下,AC旁挂在L2 switch1上,L3 switch做DHCP server为AP、Client和Host分配IP地址。需要实现无线客户端Client通过AP连接到AC上,并能与有线客户端Hos…

Pygame实现记忆拼图游戏1

1 游戏介绍 记忆拼图游戏的英文名叫做“memory puzzle”,玩家通过记忆找到相同的图片,如图1所示。 图1 记忆拼图游戏 从图1中可以看出,玩家每次点击两张图片,如果这两个图片是相同的图案(包括颜色和形状)…

JVM 调优

在生产环境中,JVM 调优是确保 Java 应用程序性能和稳定性的重要步骤。调优的目标通常是减少垃圾回收的时间、降低内存使用和提高应用程序的吞吐量。以下是一些常见的 JVM 调优策略和方法。 选择合适的垃圾收集器 -XX:UseG1GC 调整堆内存大小,通过调整堆…

深度学习基础:线性代数的本质1——深入理解向量

目录 一、向量是什么 1. 从物理学角度 2. 从计算机专业角度 3. 从数学角度 4. 思考向量的特点方式 ① 向量是空间中的箭头 ② 向量是有序的数字列表 二、向量加法和向量相乘 1. 向量加法 2. 向量相乘 一、向量是什么 线性代数中最基础,最根源的组成部分。 …

Netty 连接存活检测——如何判断连接是否断开?

一.前言 最近碰到了一个需求,需要判断客户端与服务端之间的连接是否已经断开,查阅资料后发现Netty提供了如下几种方式,现总结如下,方便后续查看。 二.存活检测方式 2.1 SO_KEEPALIVE选项 Netty提供了SO_KEEPALIVE选项&#xf…

Milvus 中常见相似度度量方法

在 Milvus 中,相似度度量方法用于衡量向量之间的相似程度,不同的度量方法有不同的特点、优缺点和适用场景。以下是对 Milvus 中常见相似度度量方法的详细介绍以及对应的 search 参数示例。 1. 欧氏距离(L2 Distance,L2&#xff0…

L3-1 夺宝大赛

输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6&#xff0c…