rust 的Clone

server/2025/3/17 2:07:53/

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 }

文章来源:https://blog.csdn.net/yinhezhanshen/article/details/146273662
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/175580.html

相关文章

C#类型转换大总结

在 C# 中,类型转换是将数据从一种类型转换为另一种类型的过程,常见的转换方式包括隐式转换、显式转换、方法转换(如 Convert 类或 Parse/TryParse)以及自定义转换操作符。以下是详细的分类和示例: 隐式转换(Implicit Conversion) 无需显式声明,编译器自动完成,通常发生…

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解,力求通过例子让新同学学习用法,帮助老同学快速回忆知识点 可视化系列: Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中,休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏,不仅规则简单,还能锻炼思维。最近,我借助 DeepSeek 的帮助,开发了一款五子棋微信小程序。在这篇文章中,我将…

【文献阅读】DeepRAG:大语言模型的检索增强推理新范式

DeepRAG:《Thinking to Retrieval Step by Step for Large Language Models》。这是一篇关于如何让大语言模型(LLMs)更聪明地进行检索增强推理(Retrieval-Augmented Generation, RAG)的研究。 标题期刊年份关键词Deep…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek,实现了AI编程,体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI(CodeGPT) 首先了解不同版本的deepsee…

虚幻基础:动画层接口

文章目录 动画层:动画图表中的函数接口:名字,没有实现。动画层接口:由动画蓝图实现1.动画层可直接调用实现功能2.动画层接口必须安装3.动画层默认使用本身实现4.动画层也可使用其他动画蓝图实现,但必须在角色蓝图中关联…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab,一种基于结构化状态空间模型(SSM)的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构,MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

Matlab:矩阵运算篇——矩阵数学运算

目录 1.矩阵的加法运算 实例——验证加法法则 实例——矩阵求和 实例——矩阵求差 2.矩阵的乘法运算 1.数乘运算 2.乘运算 3.点乘运算 实例——矩阵乘法运算 3.矩阵的除法运算 1.左除运算 实例——验证矩阵的除法 2.右除运算 实例——矩阵的除法 ヾ( ̄…