首页 > 其他分享 >RUST所有权相关问题

RUST所有权相关问题

时间:2024-10-03 15:00:52浏览次数:8  
标签:Copy trait Clone mystruct value m1 相关 所有权 RUST

先介绍一下RUST的所有权规则:
1.Rust 中的每一个值都有一个所有者(owner)。
2.值在任一时刻有且只有一个所有者。
3.当所有者(变量)离开作用域,这个值将被丢弃。

变量与数据交互的方式包括两种:移动和克隆。
移动就是转交值的所有权,如let x=y(x的类型未实现Copy trait),x失去了值的所有权而y获取了值的所有权。
克隆就是新建一份和原值相同的副本。克隆也包括两种:Copy和Clone。Copy需要实现Copy trait,就是对值做简单的按位复制操作,且Copy仅对栈内存做按位复制;而Clone需要实现Clone trait,需要为它所拥有的所有值重新分配资源,栈和堆都可以是Clone的目标。

先说Copy。并不是所有类型都可以实现 Copy trait。只有满足以下条件的类型才能实现 Copy:
1.类型本身是 POD(Plain Old Data)类型,即不包含任何指针或引用。
2.类型的所有字段都实现了Copy。
3.该类型必须实现了Clone。

常见的默认实现了Copy trait的类型有:
1.基本数据类型
2.所有元素类型都实现了Copy trait的元组
3.元素类型是实现了Copy trait的数组

对于常规的赋值、传参和方法返回值,如果该类型实现了Copy trait,那默认使用Copy;否则移动。
赋值:
struct mystruct { //mystruct未实现Copy trait value: i32, } fn main() { let m1= mystruct { value:25 }; let m2 = m1; println!("m2.value = {}", m2.value); println!("m1.value = {}", m1.value); //会报错,因为m1值的所有权被移动了 }
编译报错:

struct mystruct { //mystruct实现了Copy trait value: i32, } impl Clone for mystruct { fn clone(&self) -> mystruct { *self } } impl Copy for mystruct {} fn main() { let m1= mystruct { value:25 }; let m2 = m1; println!("m2.value = {}", m2.value); println!("m1.value = {}", m1.value); }
编译通过:

传参:
struct mystruct { //mystruct未实现Copy trait value: i32, } fn testParamStruct(m: mystruct){ println!("value = {}", m.value); } fn main() { let m1= mystruct { value:25 }; testParamStruct(m1); println!("value = {}", m1.value); //会报错,因为m1值的所有权被移动了 }
编译报错:

struct mystruct { //mystruct实现了Copy trait value: i32, } fn testParamStruct(m: mystruct){ println!("value = {}", m.value); } impl Clone for mystruct { fn clone(&self) -> mystruct { *self } } impl Copy for mystruct {} //实现Copy trait fn main() { let m1= mystruct { value:25 }; testParamStruct(m1); println!("value = {}", m1.value); //会报错,因为m1值的所有权被移动了 }
编译通过:

再说说Clone。也不是所有类型可以实现Clone triat。要实现Clonen trait,类型内部的其他类型必须都实现了Clone trait。要进行Clone,需要显式调用clone。
常见的默认实现了Clone trait的类型有:
1.基本数据类型
2.String和&str
3.所有元素类型都实现了Clone trait的元组
4.元素类型是实现了Clone trait的数组

标签:Copy,trait,Clone,mystruct,value,m1,相关,所有权,RUST
From: https://www.cnblogs.com/nomore007/p/18445647

相关文章

  • rustling学习随笔
    序言rustling是一个关于rust的练习题的项目.可以帮助大家通过完成一个项目的方式练习rust的语法,我认为对于补充我rust现学现卖过程中的情况很有帮助.下边是GPT对它的介绍:Rustling是专为那些想要学习Rust编程语言的人设计的一个交互式练习集合。无论你是编程新手还是有经......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第12期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第12期试题总结。C#部分:(前四题为字节跳动面试问题)1、List是链表还是数组答案:数组2、上一题追问:当list满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢?答案:数组搬家,会......
  • 关于Arch Linux 安装及一些相关问题总结
    关于个人ArchLinux安装及相关问题总结关于为什么ssj不得不使用Linux,就其根本地,是因为巨硬的Windows更新炸掉了ssj的蓝牙,Playing的时候只能接入两个设备,难绷0.其它记得在pacstrap前换国内的源不会有人和我一样没换等半天还不成功吧......
  • linux系统相关概念与配置
    一.本地服务器:几个相关软件(一)vmware关键字:虚拟机(搭建虚拟环境)(二)MobaXterm关键字:连接(三)123445![](https://img2024.cnblogs.com/blog/3530901/202410/3530901-20241002141002999-137920567.jpg)![](https://img2024.cnblogs.com/blog/3530901/202410/3530901-20241002141037......
  • 55_初识搜索引擎_相关度评分TF&IDF算法独家解密
    课程大纲1、算法介绍relevancescore算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度Elasticsearch使用的是termfrequency/inversedocumentfrequency算法,简称为TF/IDF算法Termfrequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数......
  • 59_初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方案
    1、preference决定了哪些shard会被用来执行搜索操作_primary,_primary_first,_local,_only_node:xyz,_prefer_node:xyz,_shards:2,3bouncingresults问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replicashard上;每次页面上看到的搜索......
  • Salesforce AI Specialist篇之 Einstein Trust Layer
    本篇参考:https://trailhead.salesforce.com/content/learn/trails/drive-productivity-with-einstein-aihttps://help.salesforce.com/s/articleView?id=sf.generative_ai_trust_layer.htm&type=5https://blog.salesforceairesearch.com/meet-salesforces-trusted-ai-prin......
  • C++中指针和数组相关的运算符优先级
    概述本文深入介绍了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何使用()来强制人为指定结合顺序。指针、数组相关的运算符优先级下表展示了相关运算符的优先级,有4个级别,同级别内的运算符按照结合性依次调用。......
  • [rCore学习笔记 028] Rust 中的动态内存分配
    引言想起我们之前在学习C的时候,总是提到malloc,总是提起,使用malloc现场申请的内存是属于堆,而直接定义的变量内存属于栈.还记得当初学习STM32的时候CubeIDE要设置stack和heap的大小.但是我们要记得,这么好用的功能,实际上是操作系统在负重前行.那么为了实现动态内存分配功......
  • 智源:LLM训练过程中的指令相关性
    ......