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…...
3大核心技术深度解析:D3KeyHelper如何重新定义暗黑3游戏辅助体验
3大核心技术深度解析:D3KeyHelper如何重新定义暗黑3游戏辅助体验 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款基于A…...
ESTree节点遍历终极指南:深度优先与广度优先算法完整解析
ESTree节点遍历终极指南:深度优先与广度优先算法完整解析 【免费下载链接】estree The ESTree Spec 项目地址: https://gitcode.com/gh_mirrors/es/estree JavaScript开发者们,你们是否在构建代码分析工具时遇到过AST遍历的难题?&…...
Qwen3.5-4B-Claude-Opus-GGUF一键部署:CSDN镜像平台Web化推理服务上线指南
Qwen3.5-4B-Claude-Opus-GGUF一键部署:CSDN镜像平台Web化推理服务上线指南 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理…...
OpenClaw成本控制:Qwen2.5-VL-7B图文任务Token消耗优化
OpenClaw成本控制:Qwen2.5-VL-7B图文任务Token消耗优化 1. 多模态任务Token消耗的痛点 当我第一次用OpenClaw对接Qwen2.5-VL-7B模型处理图文混合任务时,账单上的Token消耗数字让我倒吸一口凉气。一个简单的"分析截图内容并生成报告"的任务&a…...
Qwen2.5深度微调成果展示|像素剧本圣殿在武侠/赛博朋克题材表现
Qwen2.5深度微调成果展示|像素剧本圣殿在武侠/赛博朋克题材表现 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作环境将先进的大语言模型能力与8-Bit复古美学完美融合…...
ESP32-S3双下载方案对比:VSCode一键烧录 vs 乐鑫Flash工具实操
ESP32-S3双下载方案深度评测:VSCode高效开发 vs 乐鑫工具链生产级部署 1. 开发环境配置与工具链解析 对于ESP32-S3开发者而言,选择正确的开发工具直接影响项目效率。当前主流方案可分为两类:基于VSCode的集成化开发环境和乐鑫官方Flash下载工…...
防晒霜真的防晒吗?揭秘SPF值背后的“光“标准
盛夏将至,防晒霜成为每个人的随身必备。你是否想过:瓶身上标注的 SPF 50、PA 是如何测出来的?为什么有些防晒霜涂了还是会晒黑?所谓的"防水防汗"真的有科学依据吗?这些问题的答案,都藏在一个精密…...
大学生论文降重技巧:用AI辅助,重复率轻松降到10%以下
2026年AI学术辅助工具已进入“精准合规改写、核心语义完整保留”的全新发展阶段,彻底解决了大学生论文降重“耗时长、改写生硬、易踩学术红线”的普遍难题。据中国高校图书馆协会2026年调研数据显示,超7成大学生在论文写作过程中会遇到重复率超标的问题&…...
ReactNative项目OpenHarmony三方库集成实战:react-native-render-html
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 项目基于 RN 0.72.90 开发 📋 前言 在移动应用开发中,HTML 内容渲染是一项常见需求,特别是在新闻资讯、富文本编辑、邮件展示等场景中。React Native 原…...
OpenClaw故障排查:百川2-13B-4bits模型接口连接问题解决
OpenClaw故障排查:百川2-13B-4bits模型接口连接问题解决 1. 问题背景与现象描述 上周在尝试将本地部署的百川2-13B-4bits量化模型接入OpenClaw时,遇到了典型的Connection refused错误。这个问题困扰了我整整两天时间,期间尝试了各种常见解决…...
