当前位置: 首页 > 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…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...