Rust 02.控制、引用、切片Slice、智能指针

1.控制流

//rust通过所有权机制来管理内存,编译器在编译就会根据所有权规则对内存的使用进行
//堆和栈
//编译的时候数据的类型大小是固定的,就是分配在栈上的
//编译的时候数据类型大小不固定,就是分配堆上的
fn main() {let x: i32 = 1;{let y: i32 = 1;println!("x = {}", x);println!("y = {}", y);}{let s1 = String::from("hello");//s1.push_str(" world");println!("s1 = {}", s1); //String类型离开作用域的时候会调用drop方法let s2 = s1; //浅拷贝 只是拷贝了指针, 数据并没有拷贝println!("s2= {}", s2);//println!("s1= {}", s1); //s1在被copy后会自动释放指针内存,所以会报错//clone 深拷贝数据let s3 = s2.clone();println!("s3= {}", s3);println!("s2= {}", s2);}

在这里插入图片描述

控制权

fn takes_ownership1(some_string: String){println!("{}", some_string);
}fn takes_ownership2(some_string: String) -> String{println!("{}", some_string);some_string
}fn makes_copy(i: i32) {println!("i = {}", i);
}fn main() {let s = String::from("hello");//takes_ownership1(s); //s在调用函数后被drop,后续无法打印其值//println!("{}", s);let s2 = takes_ownership2(s);println!("{}", s2);let x = 5;makes_copy(x);println!("{}", x);println!("Hello, world!");
}

2.引用

//引用: 用法&,
//让我们创建一个指向值的应用,但是并不拥有它,因为不拥有这个值,所以,当引用离开其值指向的作用域后也不会被丢弃
fn calcute_length(s: &String) ->usize {s.len()
}//借用:&mut 可以修改字符串,同时不会执行drop操作
fn modify_s(s: &mut String) {s.push_str(", world");
}fn dangle() -> &String {let s = String::from("hello");&s
}fn main() {let mut s1 = String::from("hello");//在任意给定时间,有了可变引用之后不能再有不可变引用let r1 = &s1;let r2 = &s1;println!("{}, {}", r1, r2);let r3 = &mut s1;r3.push_str(", world");//println!("{}, {}", r1, r2); 由于r3为 可变引用, r1,r2不能在这里使用,必须在r3之前使用//引用不能为空,dangle()中给s赋值结束后就drop了,最终返回了空指针,这是不合法的//let ref_s = dangle();//println!("{}", ref_s);
}

3.Slice

//1、字符串slice是String中一部分值的引用
//2、字面值就是slice
//3、其它类型slice
fn main() {let s = String::from("hello world");let h = &s[0..5]; 	//区间[0,5)let h = &s[0..=4]; 	//区间[0,4]let h = &s[..=4]; 	//区间[0,4]let h = &s[..5]; 	//区间[0,5)println!("h = {}", h);let w = &s[6..11];  //区间[6,11)let w = &s[6..=10]; //区间[6,10]let w = &s[6..];  	//区间[6,s.len())let w = &s[..]; 	//区间[0,s.len())println!("w = {}", w);//let ss = String::from("你好");//let w1 = &ss[0..1];let a = [1, 2, 3, 4];	let sss = &a[1..3];		//取a中[1,3)的元素println!("sss = {}", sss[0]);	//a[1]println!("sss = {}", sss[1]);	//a[2]println!("len = {}", sss.len());	//长度为2
}

4.智能指针

Box
fn main() {let text: String = "Hello CSDN".to_string();// 将字符串移动到堆上 let box_text: Box<String> = Box::new(text);// 此时原text已失效,因为所有权已经转移给box_textprintln!("{}", box_text);
}
Rc
use std::rc::Rc;fn main() {//  Rc<T>提供了非独占、可共享的引用,它的内部维护了一个引用计数。当引用数量变为0时,会自动释放堆内存。let shared_data = Rc::new(66);// 创建指向同一数据的多个Rc实例let ref1 = Rc::clone(&shared_data);let ref2 = Rc::clone(&shared_data);println!("ref1: {}", ref1);println!("ref2: {}", ref2);// 当最后一个Rc实例超出作用域时,数据会被清理
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…

书生·浦语大模型-第一节课笔记

视频总结 23年发布的模型在一些材料中归位指令微调模型&#xff0c;后面逐渐升级应该已经是train的模型了 技术报告总结 InternLM2 Technical Report 评测与特点 6 dimensions and 30 benchmarks, long-context modeling, and open-ended subjective evaluations长文本…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下&#xff0c;3月25日下午&#xff0c;和鲸科技 2024 年“人工智能X”学科建设合作交流会&#xff08;北京站&#xff09;暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境&#xff0c;本次会议特别采取闭门审…

环境温度对测量平板有什么影响

环境温度可以对测量平板有影响。温度变化可以导致平板的尺寸发生变化。根据热膨胀原理&#xff0c;当环境温度升高时&#xff0c;平板的尺寸会扩大&#xff1b;当环境温度降低时&#xff0c;平板的尺寸会缩小。这种尺寸变化可能会导致测量结果的误差。因此&#xff0c;在测量平…

【蓝桥杯第十三届省赛B】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

一文了解JAVA的常用API

目录 常用kpimathSystemRuntimeObjectObjectsBigIntegerBigDecima正则表达式包装类 常用kpi 学习目的&#xff1a; 了解类名和类的作用养成查阅api文档的习惯 math 工具类。因为是工具类&#xff0c;因此直接通过类名.方法名(形参)即可直接调用 abs&#xff1a;获取参数绝对…

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

内网穿透时报错【Bad Request This combination of host and port requires TLS.】的原因

目录 前言&#xff1a;介绍一下内网穿透 1.内网直接https访问&#xff08;可以正常访问&#xff09; 程序配置的证书 2.内网穿透后,通过外网访问 3.原因 4.内网非https的Web应用&#xff0c;使用https后&#xff0c;也变成了https访问 5.题外话 感觉自己的web应用配置了…

axios post请求参数传输表单数据,其中一个key的value需要json格式, (qs的使用知识扩充)

今天遇到了一个场景&#xff0c;post请求&#xff0c;请求体的content-type是application/x-www-form-urlencoded&#xff0c;然后我按照往常的情况直接设置完&#xff0c;接口参数进行qs.stringify操作。转成表单的格式传输给后端&#xff0c;但是在浏览器中查看接口参数发现是…

极危!XZ Utils 5.6.0/5.6.1版本恶意后门植入漏洞风险通告

前日&#xff0c;亚信安全CERT监控到安全社区发布安全通告&#xff0c;披露XZ Utils 5.6.0、5.6.1版本存在恶意后门植入漏洞&#xff08;CVE-2024-3094&#xff09;。开发人员在调查SSH性能问题时发现了涉及XZ Utils的供应链攻击。从 5.6.0 版开始&#xff0c;在 xz 的上游libl…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入&#xff0c;企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式&#xff0c;通过提供强大丰富的库文件包&#xff0c;极大地简化了应用开发过程&#xff0c;降低了技术门槛。Python开发有哪些优势、挑战以及…

OpenELB使用分析

前言 OpenELB 是由青云科技开源的云原生负载均衡器&#xff0c;可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。核心功能包括&#xff1a; BGP 模式和二层网络模式下的负载均衡基于路由器 ECMP 的负载均衡IP 地…

Tuxera for Mac产品2024最新版本功能描述优化介绍

Tuxera for Mac产品描述优化 Tuxera for Mac&#xff0c;是Mac用户的专属读写神器。无论你是职场人士还是学生&#xff0c;只要你在Mac上工作、学习&#xff0c;需要频繁读写Windows格式的存储设备&#xff0c;Tuxera for Mac都将是你的不二之选。 Tuxera Ntfs For Mac 2024下…

密码算法概论

基本概念 什么是密码学&#xff1f; 简单来说&#xff0c;密码学就是研究编制密码和破译密码的技术科学 例题&#xff1a; 密码学的三个阶段 古代到1949年&#xff1a;具有艺术性的科学1949到1975年&#xff1a;IBM制定了加密标准DES1976至今&#xff1a;1976年开创了公钥密…

unbuntu mysql8.0新建用户及开启远程连接

MySQL更新到8.0以上版本后&#xff0c;在创建连接远程的用户的时候和之前5.x的版本有了很大的不同&#xff0c;不能使用原来同时创建用户和授权的命令。 以下是记录的MySQL8.0创建用户并授权的命令&#xff1a; 查看用户表&#xff1a; user mysql; select host,user,authen…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

Java的IDEA的工程管理

模块和包的图标&#xff1a; 举个例子&#xff1a; IDEA中创建包&#xff1a; 如图所示&#xff0c;com.LBJ的意思是在com包中创建子包LBJ 参见&#xff1a; IDEA中项目、模块和包的关系_idea中模块和项目-CSDN博客

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种&#xff0c;用来传递准确的时间信息。 PPS&#xff0c;Pulse Per Second&#xff0c;是每秒一次的脉冲信号&#xff0c;其上升沿表示整秒的时刻。TOD&#xff0c;Time of Day&#xff0c;是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…