Rust笔记【3】

  1. 使用指针的场景:
    1)编译时类型大小未知,用于定义struct中递归引用自身类型。
    2)移动大量数据,避免赋值。
    3)多态

  2. Rust中几种只能指针

Box<T>
Rc<T>
RefCell<T>
  1. Box
    1)b是Box类型,数据存储在堆上。
    2)Box实现了Deref trait,可以像普通引用一样使用(可以用*解引用)
    3)实现了Drop trait,离开作用域自动释放内存。
let a = 5;
let b = Box::new(a);
let b = Box::new(5);println!("b={}", *b); // 解引用使用b
println!("b={}", b); // 使用Deref强制类型转换// 用Box定义递归类型
enum List {Cons(i32, Box<List>),Nil,
}
use crate::List::{Cons, Nil};fn main() {let list = Cons(1, Box::new( Cons(2, Box::new(Nil)) ) );
}
  1. 重载解引用操作符
use std::ops::Deref;// 元组结构体定义语法参考《Rust笔记【1】》,定义和实例化都用小括号
struct MyBox<T>(T);impl<T> Deref for MyBox<T> {type Target = T; // 关联类型fn deref(&self) -> &Self::Target {// 这里必须返回&self.0(变量地址,指针),在解引用时,自动调用deref方法,让后再进行解引用操作,// deref()必须返回地址(指针)&self.0}
}impl<T> MyBox<T> {fn new(x: T) -> MyBox<T> {MyBox(x)}
}fn main() {let x = 2;let y = MyBox::new(x);assert_eq!(2, *y); // *y -> *(y.deref())
  1. Deref强制转换

Deref 强制转换(deref coercions)将实现了Deref trait 的类型的引用转换为另一种类型的引用。例如,
Deref 强制转换可以将&String 转换为&str,因为String 实现了Deref trait 因此可以返回&str。Deref
强制转换是Rust 在函数或方法传参上的一种便利操作,并且只能作用于实现了Deref trait 的类型。当
这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行

Rust 在发现类型和trait 实现满足三种情况时会进行Deref 强制转换:
• 当T: Deref<Target=U> 时从&T 到&U。
• 当T: DerefMut<Target=U> 时从&mut T 到&mut U。
• 当T: Deref<Target=U> 时从&mut T 到&U。

  1. Drop trait
    1)在退出作用域时Drop::drop方法自动调用,不能手动调用。
    2)如果要提前释放,调用:std::mem::drop方法
trait Drop {fn drop(&mut self);
}obj.drop(); // Drop::drop()方法,不能主动调用
drop(obj); // 调研std::mem::drop
  1. Rc指针
use std::rc::Rc; // Rc<T>不在prelude中,显式引入let a = Rc::new(12);
Rc::strong_count(&a)let b = Rc::clone(&a);
Rc::weak_count(&a)
  1. RefCell
    选择Box,Rc 或RefCell 的理由:
    • Rc 允许相同数据有多个所有者;Box 和RefCell 有单一所有者。
    • Box 允许在编译时执行不可变或可变借用检查;Rc仅允许在编译时执行不可变借用检查;
    RefCell 允许在运行时执行不可变或可变借用检查。
    • 因为RefCell 允许在运行时执行可变借用检查,所以我们可以在即便RefCell 自身是不可变
    的情况下修改其内部的值。
RefCell<T>
  1. 内部可变性

  2. 使用Weak指针代替Rc指针,避免循环引用

parent: RefCell::new(Weak::new())
parent.borrow().upgrade()let temp = Rc::new(121);
let w = Rc::downgrade(&temp);

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

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

相关文章

TypeScript_抓取酒店价格数据

我们导入所需的库&#xff0c;包括http和request。然后&#xff0c;我们定义一个函数&#xff0c;该函数接受一个URL作为参数。 import http from http; import request from request;const fetchHotelPrices (url: string) > {// ... }接下来&#xff0c;我们使用request…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程&#xff0c;供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆&#xff0c;同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆&#xff0c;于是首先去查看了登陆功能的报错…

Linux 进程控制

进程地址空间的收尾 task_struct有一个结构体成员叫mm_struct&#xff0c;也就是进程地址空间。 为什么要有进程地址空间&#xff1a;进程内存地址管理&#xff0c;保护物理内存&#xff0c;进行权限审查&#xff0c;从无序变有序&#xff0c;让我们从统一的视角看待进程代码…

排序_小结

排序篇(六)----排序小结\n排序算法复杂度及稳定性分析\n直接插入排序的算法复杂度&#xff1a;\n\n最好情况下&#xff0c;当数组已经有序时&#xff0c;直接插入排序的时间复杂度为O(n)&#xff0c;其中n是数组的大小。\n最坏情况下&#xff0c;当数组逆序排列时&#xff0c;直…

ModuleNotFoundError: No module named ‘torchvision.models.utils‘

如图报错&#xff1a;No module named torchvision.models.utils解决方案&#xff1a;由于当前python环境高版本的torch&#xff0c; 代码用的是低版本的语法 将 from torchvision.models.utils import load_state_dict_from_url换成 from torch.hub import load_state_dict_fr…

Python编程题集(第一部分基本语法基础)

Demo01 摄氏温度转化为华氏温度 题目描述&#xff1a; 输入一个摄氏温度的值&#xff0c;将它转变为华氏温度&#xff0c;并将结果输出 转换的公式为如下&#xff1a;fahrenheit (9 / 5 ) * celsius 32 输入输出描述 输入一个值表示摄氏温度celsius 输出华氏温度fahren…

数据结构与算法—插入排序选择排序

目录 一、排序的概念 二、插入排序 1、直接插入排序 直接插入排序的特性总结&#xff1a; 2、希尔排序 希尔排序的特性总结&#xff1a; 三、选择排序 1、直接选择排序 时间复杂度 2、堆排序—排升序(建大堆) 向下调整函数 堆排序函数 四、交换排序 1、冒泡排…

CF1866M Mighty Rock Tower

CF题面 luogu题面 期望题。 题目大意&#xff1a;一个人在搭积木&#xff0c;每次堆叠可能成功或失败&#xff0c;失败可能导致其下面连续的若干块掉落。给定搭每一块时失败的概率&#xff0c;求堆叠完成的期望次数。 具体的&#xff0c;假设当前正在堆叠第 i 块&#xff0c;…

Elasticsearch:RAG vs Fine-tunning (大语言模型微调)

如果你对 RAG 还不是很熟悉的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;什么是检索增强生成 - RAG&#xff1f;”。你可以阅读文章 “Elasticsearch&#xff1a;在你的数据上训练大型语言模型 (LLM)” 来了解更多关于如何训练你的模型。在今天的文章中&#…

数据结构大体体系

逻辑结构 线性结构线性表一串珠子用线连起来&#xff0c;这就是典型的“线性存储结构”。每颗珠子之间的关系结构也很简单&#xff0c;包括头尾的话&#xff0c;它们最少有一个关系对象&#xff0c;而中间的珠子无论前后都只有一个关系对象&#xff0c;即 one-to-one栈队列字符…

<Linux>Linux高级技巧和命令(自用)

《Linux高级技巧和命令&#xff08;自用&#xff09;》 1 技巧1.1 清空文件1.2 快速生成大文件1.3 安全擦除硬盘数据1.4 快速制作系统盘1.5 查看某个进程的部分参数1.6 时间戳转换1.7 查看ASCII码1.8 删除乱码文件1.9 批量下载网页资源1.10 历史命令 1 技巧 1.1 清空文件 $ &…

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点&#xff1a;通过预训练的方式&#xff0c;可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…

19、Flink 的Table API 和 SQL 中的内置函数及示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

项目管理之如何召开项目时间箱启动会议

时间箱启动会议是项目管理中至关重要的一环&#xff0c;它帮助项目团队明确目标、分配任务、制定计划&#xff0c;并为项目的顺利实施提供指导和支持。下边为大家介绍有关如何召开时间箱启动会议的一些建议&#xff1a; 确定会议目标 在召开时间箱启动会议前&#xff0c;首先…

Tomcat,jdk下载配置(发布项目)

Tomcat&#xff0c;jdk下载&#xff0c; 远程连接 启动以下服务 高级设置 允许别人连接进来 网上搜索jdk下载即可 双击下一步即可 下一步 输入java&#xff0c;看有没有安装成功 这是安装成功的 Tomcat就可以安装了 和以上操作一样&#xff0c;在网上下载安装包&#xff0c;…

APP开发:用途与未来前景|软件定制开发|网站小程序建设

APP开发&#xff1a;用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分&#xff0c;无论是日常生活还是商业领域&#xff0c;都有它的身影。通过开发APP&#xff0c;我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序&#xff0c;满…

java的反应式流

Java的反应式流是一种新的编程模型&#xff0c;它在异步和事件驱动的环境下工作。反应式流的目的是为了解决传统的单线程或者多线程编程模型在高并发和大流量情况下的性能瓶颈。 反应式流的核心是Observable和Observer&#xff0c;Observable表示一个数据流&#xff0c;而Obse…

一、配置环境

一、配置Java环境 确保安装了Java开发工具包&#xff08;JDK&#xff09;&#xff0c;并且设置了JAVA_HOME环境变量。 二、配置FFmpeg环境 如果使用了FFmpeg相关的功能&#xff0c;需要确保系统中已经安装了FFmpeg&#xff0c;并且设置了FFMPEG_HOME环境变量。 ffmpeg安装教…

Unity json反序列化为 字典存储

当在Unity游戏中需要加载和管理游戏数据&#xff0c;通常使用JSON文件是一种常见的方法。在本篇博客中&#xff0c;我们将深入探讨如何使用C#和Unity的JSON反序列化功能来实现这一目标。我们可以使用Unity的JsonUtility来反序列化JSON数据并将其映射到自定义的C#数据结构中。 …

【CSDN 每日一练 ★☆☆】【链表】删除排序链表中的重复元素

【CSDN 每日一练 ★☆☆】【链表】删除排序链表中的重复元素 链表 递归 题目 存在一个按升序排列的链表&#xff0c;给你这个链表的头节点 head &#xff0c;请你删除所有重复的元素&#xff0c;使每个元素 只出现一次 。 返回同样按升序排列的结果链表。 示例 示例 1&am…