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中每一个引用都有生命周期,也就是引用保持有效的作用域。生命周期主要目标是避免悬垂引用,悬垂引用就是引用了已经释放的值。函数中,x的生命周期不能小于返回值得生命周期。当有x和y的时候,两者的生命周期是两个里面较小的那…...
【Linux】线程池
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...
运动版蓝牙耳机什么牌子的好、运动款蓝牙耳机推荐
何以解忧?唯有运动。事实已经无数次证明,运动不但可以让你更瘦身、更紧实,更重要的是精神状态也能焕然一新。不知道各位是不是也跟我一样,喜欢在运动的时候听着音乐。但是听音乐就需要有好的续航,否则运动一半没电了&a…...
MySQL中自带的数据库表相关介绍
mysql的自带数据库表主要有以下几个: (1)information_schema (2)performance_schema (3)mysql (4)sys (5)可能存在空数据库test 一、informa…...
【微信小程序】--注册小程序账号(一)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…...
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年,中国车载毫米波雷达市场战火明显升级。 一方面,愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间,也快速转移到与国产供应商之间;随着部分外资巨头的本土化战略深入落地,同时对国产供应商造成了压力。 …...
26岁曾月薪15K,现已失业3个月,我依然没有拿到offer......
我做测试5年,一线城市薪水拿到15K,中间还修了一个专升本,这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知,但我还是对我的薪水不是很满意,于是打算出去面试,希望可以搏一个高薪。 但真到面…...
华为OD机试 - 打印文件 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...
【前端】浏览器的渲染流程(完整)
本文主要包含以下内容:浏览器渲染整体流程解析 HTML样式计算布局分层生成绘制指令分块光栅化绘制常见面试题浏览器渲染整体流程浏览器,作为用户浏览网页最基本的一个入口,我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入…...
华为OD机试 - 有效子字符串 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...
抽象类和接口
抽象类和接口 抽象类和接口的定义 抽象类主要用来抽取子类的通用特性,作为子类的模板,它不能被实例化,只能被用作为子类的超类。 接口是抽象方法的集合,声明了一系列的方法操作,如果一个类实现了某个接口,…...
STM32DSP库汇总
前言 本文仅对stm32的DSP库进行汇总,具体函数使用方式持续更新…… 分类函数名描述 BasicMathFunctions 基础数学函数 abs绝对值add加法dot_prod向量点积mult乘法negate相反数offset 偏置 scale比例缩放shift移位sub减法 ComplexMathFunctions 复数数学函数 conj…...
C++类和对象----思想基础应用
类与对象的思想&基础应用一、类声明1.1、封装类的意义1.1.1、在设计类的时候,属性和行为写在一起,表现事物1.1.2、成员权限1.2、struct和class区别1.3、成员属性设置为私有二、对象的初始化和清理2.1、构造函数&析构函数2.2、构造函数分类方法一…...
力扣解法汇总1792. 最大平均通过率
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 一所学校里有一些班级,每个班级里有一些学生,现在每个班…...
动手学深度学习(第二版)学习笔记 第二章
官网:http://zh.d2l.ai/ 视频可以去b站找 记录的是个人觉得不太熟的知识 第二章 预备知识 代码地址: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 系统目录结构
登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里…...
stable diffusion webui安装与使用(官方超简单教程)
预备依赖 下载miniconda 教程参考:https://blog.csdn.net/weixin_43828245/article/details/124768518安装git 参考教程:https://blog.csdn.net/weixin_46474921/article/details/127091723 下载sd-webui 官网 https://github.com/AUTOMATIC1111/stab…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
