当前位置: 首页 > news >正文

Rust编程细节知识点拾遗

1.Rust中每一个引用都有生命周期,也就是引用保持有效的作用域。生命周期主要目标是避免悬垂引用,悬垂引用就是引用了已经释放的值。函数中,x的生命周期不能小于返回值得生命周期。当有x和y的时候,两者的生命周期是两个里面较小的那个。大多数情况下可以通过上下文判断出变量的生命周期,当借用检查器无法判断某些变量的生命周期时,就需要使用生命周期标注。
2.生命周期实例,总结网页生命周期例子,以及string和&str。结构体生命周期标注其实就是结构体里面的变量活的时间要比结构体实例长或者一样。标注的话也只是编译器不知道,需要标注,标注完它会检查。生命周期标注的省略:第一种就是如果只有一个输入生命周期参数,那么它将赋予所有输出生命周期参数。第二种就是如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为&self或者&mut self,那么self的生命周期被赋予所有输出生命周期参数。
3.move关键字会将闭包里使用的环境中的变量的所有权移进闭包。trait作为参数,就是说函数的参数item不管什么类型,需要实现trait的类型,函数调用传入的是一个类型。
4.每个迭代器都实现了Iterator trait,有next方法,这个trait定义在标准库中,next返回的是Option枚举类型,返回结果包裹在Some里面,当迭代器结束时,返回None。
使用v1.iter(),引用。迭代之后后面还能用,在不可变引用上创建迭代器,元素不可变。调用next方法时,需要使用可变引用mut类型。
使用v1.iter_mut(),引用。迭代可变的引用,元素是可变的,原来的vec!会改变数据,但是还是可用的。这里注意v的类型是引用类型,可以直接打印,但是计算的时候必须解引用。
使用into_iter(),移动。这种创建的迭代器会被移动到新的作用域上,会获得所有权,后面不能使用v1了。
消费型适配器,就是v1变成迭代器v1_iter之后,可以使用sum方法求和,这个时候v1_iter的所有权被转移到sum里面,就不可用了,但是v1还是可用的。
迭代适配器,就是把一个迭代器转换成其他类型的迭代器,使用collect只是变成一个集合。例子
let v2:Vec<_>=v1.iter().map(|x|x+1).collect()
let v2:Vec<_>=v1.iter().filter(|x|*x>5).collect()。
5.cargo工作空间:首先使用cargo.toml里面写几个成员,一个为main,另一些为lib,然后main调用lib函数,需要在main的依赖里导入lib的库,在代码中use进来。最后运行是使用-p参数来指定运行main函数。

智能指针和多线程部分

1.普通引用和智能指针的区别:引用只是借用数据的指针,而智能指针则是拥有它们指向的数据。智能指针通常使用结构体实现,区别于常规结构体的显著特征在于其实现了Deref和Drop trait。解引用就是用*来解引用,这里源码是固定代码实现&self.0,返回的也是&T。解引用多态,理解成自动解引用吧,就是明明是一个智能指针类型m,当函数参数传入时是&m,过程:将MyBox变为&String,再将String解引用,变为字符串slice,&str。一共有三种解引用多态与可变性交互。
2.Drop trait类似于其他语言中的析构函数了,当值离开作用域的时候执行此函数的代码。fn drop(&mut self),这个离开作用域是自动调用的,所以可以不用写出来。如果想提前释放,可以使用drop(b),这样不会造成二次释放。
3.智能指针一共有三种,一个是Box,解决编译时未知大小的类型,希望大量数据不被拷贝的情况下转移所有权。一个是Rc,这个是解决类似链表中的多个引用指向一个的情况,允许相同数据有多个所有者,使用Box会转移所有权,后面没法使用a了,就是链表连接问题。另一个是RefCell,由于Rc是不可不变引用,在需要修改时需要使用RefCell完成内部可变性(允许在使用不可变引用时改变数据)。
4.类似于Rc和RefCell只能用于单线程的场景。Rc允许相同数据有多个所有者,Box和RefCell有单一所有者。Box允许在编译时执行不可变或可变借用检查,Rc仅允许在编译时执行不可变借用检查,RefCell允许在运行时执行不可变或可变借用检查,所以可以在即便RefCell自身不可变的情况下修改其内部值。
5.Rc智能指针 let b=Cons(3,Rc::clone(&a),使用a.clone()也可以。使用Rc::strong_count(&a)来获取引用计数,释放之后就会减一。通过Rc允许程序的多个部分之间只读的共享数据,简单理解就是相同位置的多个可变引用会造成数据竞争。RefCell智能指针Cons(Rc<RefCell>,Rc),这里就是Rc里面套个RefCell,可以改变数据,改变方法是*value.borrow_mut()+=10。补充一个引用循环的例子,自己去看官方教程,比较不错。就是两个链表首位相连变成一个环,造成内存泄露。
6.为了解决引用循环的问题,有一个弱引用的概念Weak,弱引用通过Rc::down grade传递Rc实例的引用,调用Rc::downgrade会得到Weak类型的智能指针,同时将weak_count加一。区别在于weak_count无需计数为0就能使Rc实例被清理,只要strong_count为0就可以了。
7.有一个树形结构,自己看官方教程,就是如何使用rust来写一个树的数据结构。 多线程存在的问题:竞争状态,死锁,bug难以重现和修复。
8.使用.join()就会阻塞其他线程,等待此线程完成,返回为一个result枚举。线程外面定义的数据线程里面想要使用,这是一种安全的方式,比如里面使用了数据,但是外面在线程没运行完就drop数据,这是错误的。就需要使用move关键字,使用完之后后面的线程就无法使用,所有权被转移进使用的线程。
9.多线程通道介绍,rust实现消息传递并发的主要工具是通道,通道由两个部分组成,一个是发送端,一个是接收端,发送者或者接受者任一个被丢弃就可以认为通道被关闭了。

通过mpsc::channel创建通道,是多个生产者,单个消费者。
通过spmc::channel创建通道spmc是一个生产者,多个消费者。
tx.send(val).unwrap()
rx.recv().unwrap()

10.发送者的send方法返回的是一个result枚举,如果接收端已经被丢弃了,将没有发送的目标,此时发送会返回错误。接收者的recv返回值也是一个result类型,当通道发送端关闭时,返回一个错误值。接收端这里使用recv方法,会阻塞到有一个消息到来,我们也可以使用try_recv(),不会阻塞,会立即返回。值被移动到通道之后,会发生move操作,线程无法继续使用。rx自己实现了迭代器,可以直接遍历。实现多个生产者一个消费者的例子,就是把tx复制几份。
11.通道类似于单所有权的方式,值传递到通道之后,发送者就无法使用这个值了。共享内存类似于多所有权,即多个线程可以同时访问相同的内存位置。

互斥器:Mutex智能指针
1.任意时刻,只允许一个线程来访问某些数据。2.互斥器使用时,需要先获取到锁,使用后需要释放锁,这里释放超出作用域就会自动释放。
Mutex是一个智能指针,lock调用返回一个叫做MutexGuard的智能指针,内部提供了drop方法,实现当离开作用域时自动释放锁。
在创建多个线程时,我们使用move时会报错,因为move进去第一个线程时,后面就无法使用。这里考虑使用共享所有权的Rc智能指针,每次用都clone一下,之前讲过rc和refcell都是线程不安全的,无法使用。
引入Arc智能指针,每次用都clone一下,就是可以的了。Mutex类似于RefCell提供内部可变性。而RefCell和Rc是非线程安全的,Mutex和Arc是线程安全的。

相关文章:

Rust编程细节知识点拾遗

1.Rust中每一个引用都有生命周期&#xff0c;也就是引用保持有效的作用域。生命周期主要目标是避免悬垂引用&#xff0c;悬垂引用就是引用了已经释放的值。函数中&#xff0c;x的生命周期不能小于返回值得生命周期。当有x和y的时候&#xff0c;两者的生命周期是两个里面较小的那…...

【Linux】线程池

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…...

运动版蓝牙耳机什么牌子的好、运动款蓝牙耳机推荐

何以解忧&#xff1f;唯有运动。事实已经无数次证明&#xff0c;运动不但可以让你更瘦身、更紧实&#xff0c;更重要的是精神状态也能焕然一新。不知道各位是不是也跟我一样&#xff0c;喜欢在运动的时候听着音乐。但是听音乐就需要有好的续航&#xff0c;否则运动一半没电了&a…...

MySQL中自带的数据库表相关介绍

mysql的自带数据库表主要有以下几个&#xff1a; &#xff08;1&#xff09;information_schema &#xff08;2&#xff09;performance_schema &#xff08;3&#xff09;mysql &#xff08;4&#xff09;sys &#xff08;5&#xff09;可能存在空数据库test 一、informa…...

【微信小程序】--注册小程序账号(一)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…...

Java多线程 - 利用Callable或CompletableFuture实现多线程异步任务执行

文章目录1. Callable接口源码2. Future接口的源码3. RunnableFuture接口和FutureTask实现类4. 利用线程池和Callable接口实现异步执行任务5. 利用CompleteFutable实现多线程异步任务执行1. Callable接口源码 FunctionalInterface public interface Callable<V> {// 这个…...

【ts + webpack】贪吃蛇小游戏

目录 一、项目搭建 1.1 初始化项目 二、项目界面布局 三、完成Food类 四、完成记分牌类 五、初步完成snake类 六、创建游戏控制器类 - 键盘事件 七、GameControl - 使蛇移动 八、蛇撞墙和吃食检测 一、项目搭建 1.1 初始化项目 1.使用init命令生成package.json文件 …...

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年&#xff0c;中国车载毫米波雷达市场战火明显升级。 一方面&#xff0c;愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间&#xff0c;也快速转移到与国产供应商之间&#xff1b;随着部分外资巨头的本土化战略深入落地&#xff0c;同时对国产供应商造成了压力。 …...

26岁曾月薪15K,现已失业3个月,我依然没有拿到offer......

我做测试5年&#xff0c;一线城市薪水拿到15K&#xff0c;中间还修了一个专升本&#xff0c;这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知&#xff0c;但我还是对我的薪水不是很满意&#xff0c;于是打算出去面试&#xff0c;希望可以搏一个高薪。 但真到面…...

华为OD机试 - 打印文件 | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

【前端】浏览器的渲染流程(完整)

本文主要包含以下内容&#xff1a;浏览器渲染整体流程解析 HTML样式计算布局分层生成绘制指令分块光栅化绘制常见面试题浏览器渲染整体流程浏览器&#xff0c;作为用户浏览网页最基本的一个入口&#xff0c;我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入…...

华为OD机试 - 有效子字符串 | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

抽象类和接口

抽象类和接口 抽象类和接口的定义 抽象类主要用来抽取子类的通用特性&#xff0c;作为子类的模板&#xff0c;它不能被实例化&#xff0c;只能被用作为子类的超类。 接口是抽象方法的集合&#xff0c;声明了一系列的方法操作&#xff0c;如果一个类实现了某个接口&#xff0c;…...

STM32DSP库汇总

前言 本文仅对stm32的DSP库进行汇总&#xff0c;具体函数使用方式持续更新…… 分类函数名描述 BasicMathFunctions 基础数学函数 abs绝对值add加法dot_prod向量点积mult乘法negate相反数offset 偏置 scale比例缩放shift移位sub减法 ComplexMathFunctions 复数数学函数 conj…...

C++类和对象----思想基础应用

类与对象的思想&基础应用一、类声明1.1、封装类的意义1.1.1、在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物1.1.2、成员权限1.2、struct和class区别1.3、成员属性设置为私有二、对象的初始化和清理2.1、构造函数&析构函数2.2、构造函数分类方法一…...

​力扣解法汇总1792. 最大平均通过率

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班…...

动手学深度学习(第二版)学习笔记 第二章

官网&#xff1a;http://zh.d2l.ai/ 视频可以去b站找 记录的是个人觉得不太熟的知识 第二章 预备知识 代码地址&#xff1a;d2l-zh/pytorch/chapter_preliminaries 2.1 数据操作 2.1. 数据操作 — 动手学深度学习 2.0.0 documentation 如果只想知道张量中元素的总数&#…...

CMake构建静态库与动态库以及使用

CMake构建静态库与动态库一、任务二、准备工作三、编译共享库四、ADD_LIBRARY指令五、编译静态库5.1、SET_TARGET_PROPERTIES指令5.2、GET_TARGET_PROPERTY指令六、动态库版本号七、安装共享库和头文件八、使用外部共享库和头文件8.1、准备工作8.2、引入头文件搜索路径8.3、为 …...

Linux 系统目录结构

登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 你会看到如下图所示: 树状目录结构&#xff1a; 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里…...

stable diffusion webui安装与使用(官方超简单教程)

预备依赖 下载miniconda 教程参考&#xff1a;https://blog.csdn.net/weixin_43828245/article/details/124768518安装git 参考教程&#xff1a;https://blog.csdn.net/weixin_46474921/article/details/127091723 下载sd-webui 官网 https://github.com/AUTOMATIC1111/stab…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...