【Rust】20. Rust 的高级特征

news2024/12/24 22:06:29

在这里插入图片描述

20.1 不安全 Rust

在这里插入图片描述

20.1.1 不安全的超能力

在这里插入图片描述

20.1.2 解引用裸指针

  • 裸指针(raw pointers):类似于引用类型;和引用一样,裸指针是不可变或可变的,分别写作 *const T*mut T,这里的星号不是解引用运算符,它是类型名称的一部分
  • 在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值
  • 直接从保证安全的引用来创建他们(比如使用 as 来强转为某类型),可以知道这些特定的裸指针是有效,但是不能对任何裸指针做出如此假设
  • 裸指针与引用和智能指针的区别,如下 4 点
  • 允许忽略借用规则:可以同时拥有不可变和可变的指针(若通过可变指针修改数据,则可能潜在造成数据竞争!),或多个指向相同位置的可变指针
  • 不保证指向有效的内存
  • 允许为空
  • 不能实现任何自动清理功能

在这里插入图片描述
在这里插入图片描述

20.1.3 调用不安全函数或方法(一):基本概念

在这里插入图片描述

20.1.4 调用不安全函数或方法(二):创建不安全代码的安全抽象

  • slice::from_raw_parts_mut 函数是不安全的因为它获取一个裸指针,并必须确信这个指针是有效的
  • 裸指针上的 add 方法也是不安全的,因为其必须确信此地址偏移量也是有效的指针
  • 注意无需将 split_at_mut 函数的结果标记为 unsafe,并可以在安全 Rust 中调用此函数。我们创建了一个不安全代码的安全抽象,其代码以一种安全的方式使用了 unsafe 代码

在这里插入图片描述
在这里插入图片描述

20.1.5 调用不安全函数或方法(三):使用 extern 函数调用外部代码

在这里插入图片描述

20.1.6 访问或修改可变静态变量

  • 常量:
  • 可变静态变量:静态变量中的值有一个固定的内存地址(使用这个值总是会访问相同的地址);访问不可变静态变量是安全的
  • 可变静态变量:使用 mut 关键字来指定可变性;访问和修改可变静态变量都是 不安全 的,必须位于 unsafe 模块内

在这里插入图片描述

20.1.7 实现不安全 trait

在这里插入图片描述

20.1.8 访问联合体中的字段

在这里插入图片描述

20.1.9 何时使用不安全代码

在这里插入图片描述

20.2 高级 trait

20.2.1 关联类型:在 trait 定义中指定占位符类型

  • **关联类型(associated types)**是一个将类型占位符与 trait 相关联的方式,这样 trait 的方法签名中就可以使用这些占位符类型
  • 关联类型也会成为 trait 契约的一部分:trait 的实现必须提供一个类型来替代关联类型占位符
  • 作用:用于类型占位,不用重复多次仅修改类型来实现同一个功能

在这里插入图片描述

20.2.2 默认泛型类型参数和运算符重载

  • 默认参数类型主要应用:1、扩展类型而不破坏现有代码;2、在大部分用户都不需要的特定情况进行自定义

在这里插入图片描述
在这里插入图片描述

20.2.3 完全限定语法与消歧义:调用相同名称的方法

  • 同名问题:Rust 既不能避免一个 trait 与另一个 trait 拥有相同名称的方法,也不能阻止为同一类型同时实现这两个 trait,甚至直接在类型上实现开始已经有的同名方法也是可能的
  • 对于方法(有 self 参数):编译器默认调用直接实现在类型上的方法
  • 对于关联函数(没有 self 参数):直接调用定义于实现在类型中的关联函数
  • 完全限定语法:<Type as Trait>::function(receiver_if_method, next_arg, ...);,唯一地指定出哪个对象类型(type)所实现的哪个 trait 方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20.2.4 父 trait 用于在另一个 trait 中使用某 trait 的功能

  • 父(超)trait(supertrait):在实现 trait 时通过 子模块: 父模块 指定其依赖的上一级父 trait,即可获得父 trait 的方法。比如:OutlinePrint: fmt::Display
  • 注意:需要同时满足子、父 trait 的实现要求!

在这里插入图片描述

20.2.5 newtype 模式用以在外部类型上实现外部 trait

在这里插入图片描述

20.3 高级类型

20.3.1 为了类型安全和抽象而使用 newtype 模式

在这里插入图片描述

20.3.2 类型别名用来创建类型同义词

  • 类型别名(type alias):使用 type 关键字来给予现有类型另一个名字,主要用途是减少重复

在这里插入图片描述
在这里插入图片描述

20.3.3 从不返回的 never type

  • ! 空类型 / 不返回类型:在函数从不返回的时候充当返回值,可以强转为任何其他类型

在这里插入图片描述
在这里插入图片描述

20.3.4 动态大小类型和 Sized trait

  • Rust 中动态大小类型的常规用法:他们有一些额外的元信息来储存动态信息的大小
  • 动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后
  • Sized trait 来决定一个类型的大小是否在编译时可知;这个 trait 自动为编译器在编译时就知道大小的类型实现;另外,Rust 隐式的为每一个泛型函数增加了 Sized bound

在这里插入图片描述

20.4 高级函数与闭包

20.4.1 函数指针

  • 函数指针(function pointer):通过函数指针允许使用函数作为另一个函数的参数函数满足类型 fn(小写的 f),不要与闭包 trait 的 Fn(大写)相混淆
  • 不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数
  • 函数指针实现了所有三个闭包 trait(FnFnMutFnOnce,所以总是可以在调用期望闭包的函数时传递函数指针作为参数

在这里插入图片描述
在这里插入图片描述

20.4.2 返回闭包

在这里插入图片描述

20.5 宏

20.5.1 宏和函数的区别

  • 从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程(metaprogramming)
  • 宏与函数的区别,如下 3 点
  • 宏能够接收不同数量的参数,但函数签名必须声明函数参数个数和类型
  • 在一个文件里调用宏 之前 必须定义它,或将其引入作用域;而函数则可以在任何地方定义和调用
  • 宏定义通常要比函数定义更难阅读、理解以及维护

在这里插入图片描述
在这里插入图片描述

20.5.2 macro_rules! :声明宏用于通用元编程

在这里插入图片描述
在这里插入图片描述

20.5.3 用于从属性生成代码的过程宏

在这里插入图片描述

20.5.4 如何编写自定义 derive 宏

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20.5.5 类属性宏

  • 自定义派生宏derive 属性生成代码,derive 只能用于结构体和枚举
  • 类属性宏:类属性宏与自定义派生宏相似,能创建新的属性,属性还可以用于其它的项(比如:函数),也更为灵活

在这里插入图片描述

20.5.6 类函数宏

  • 类函数(Function-like)宏:定义看起来像函数调用的宏,类似于 macro_rules!,它们比函数更灵活(例如,可以接受未知数量的参数)

在这里插入图片描述

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

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

相关文章

Kubernetes集群部署与实践

一、提要 部署Kubernetes集群至少需要3台服务器&#xff0c;其中至少要有1个服务器做master节点&#xff0c;至少要有1个服务器做node节点&#xff0c;且节点名称是唯一的。 当集群中只有一个master节点时&#xff0c;如果其出现了故障&#xff0c;会导致Kubernetes的控制平面…

规则引擎-drools-5-决策表

文章目录Excel格式决策表 官网地址决策表使用方式Excel组成部分与drl规则文件对应关系Excel文件内容示例drl规则文件内容Excel决策表内容说明1. RuleSet2. RuleTable3. Attributes示例Excel转化drl代码及结果执行drl代码及结果Excel格式决策表 官网地址 决策表这部分内容在官网…

几种IO模型

IO真正的IO操作涉及到和IO设备的交互&#xff0c;而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互&#xff0c;一般会使用操作系统的System Call&#xff0c;即系统调用&#xff0c;读是read()&#xff0c;写是write()&#xf…

设计模式-结构型模式

目录 5.结构型模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 JDK动态代理 5.1.5 CGLIB动态代理 5.1.6 三种代理的对比 5.1.7 优缺点 5.1.8 使用场景 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 应…

聊聊关于矩阵反向传播的梯度计算

目录 1. 前向传播 2. 反向传播 3. 矩阵反向传播 4. 总结 1. 前向传播 建立如图所示的简单网络 W 是权重矩阵&#xff0c;初始赋值为 2*2 的矩阵 X 是输入特征&#xff0c;初始赋值为 2*1 的矩阵 这样通过矩阵乘法 &#xff0c; Y WX &#xff0c;应该得到一个 2*1 的输…

在这竞争激烈的时代,如何才能够在激烈竞争中脱颖而出呢

不管是在职场想要获得认可得到晋升&#xff0c;还是与客户谈合作&#xff1b;都需要你能够脱颖而出。让他人能够看到你并且认可你。那如何才能脱颖而出呢&#xff1f;首先你要先认识自己&#xff0c;知道自己有什么优势、劣势、技能、兴趣、爱好等等。明确自己有什么价值&#…

软件工程(1)--初识基础概念

前言 学习了半年的软件工程课程&#xff0c;总不能一无所获吧&#xff0c;故此写下文章总结一番。 软件工程是一门综合性交叉学科&#xff0c;它涉及计算机科学、工程科学、管理科学和数学等领域。学习目标是掌握需求分析、软件设计、编码风格、软件测试的工程化方法。 软件程序…

什么是股票量化研究?

谈到股票量化研究领域&#xff0c;肯定少不了有自动交易系统的支撑&#xff0c;像平时能将股票池中的数据挖掘出来也能熟能生巧的进行自助量化研究&#xff0c;包括数据接口系统的开发使用都是受到量化的影响&#xff0c;那么&#xff0c;如何看待股票量化研究&#xff1f;像平…

arm版(以uos为例)linux安装mysql8

官网下载&#xff1a;https://downloads.mysql.com/archives/community/上传到服务器&#xff0c;然后解压缩tar -zxvf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gzmv mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql-8创建MySQL数据目录mkdir -p /datacd datamkdir …

打通对账的最后一公里——对账管理平台

背景 日新月异的科技与快速变化的消费需求不断驱动零售模式的变革&#xff0c;实体商业与数字经济、传统零售与新零售&#xff0c;逐渐融合并形成了全渠道、一体化的发展趋势&#xff0c;也改变了以往企业认知中线上、线下渠道割裂的思维定式&#xff0c;零售快消类企业纷纷建…

电子技术——MOS管的物理特性

电子技术——MOS管的物理特性 增强型 MOSFET 是应用最广泛的场效应晶体管。除了最后一节&#xff0c;我们整章讨论的都是增强型 MOSFET 。我们从它的物理元件结构和物理操作入手&#xff0c;在下一节我们会在本节的基础上学习 MOSFET 的电流-电压特性。 元件结构 上图展示了n-…

Day876.redolog刷盘问题 -MySQL实战

redolog刷盘问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于redolog刷盘问题的内容。 平时的工作中&#xff0c;一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很…

RPA自动化办公07——Uibot流程加入python插件

参考&#xff1a;扩展UiBot命令_UiBot开发者指南 Uibot是非常方便&#xff0c;但是有些功能可能还需要别的语言来完成&#xff0c;例如python语言&#xff0c;作为胶水语言&#xff0c;在一个Uibot里面插入python脚本是很方便&#xff0c;好用的。 加入插件的位置 在新建一个流…

Seata分布式事务模式(TA、TCC、XA、SAGA)工作机制

前言 分布式应用痛点 分布式应用有一个比较明显的问题就是&#xff0c;一个业务流程通常需要几个服务来完成&#xff0c;业务的一致性很难保证。为了保障业务一致性&#xff0c;每一步都要在 catch 里去处理前面所有的“回滚”操作&#xff0c;可读性及维护性差&#xff0c;开…

分布式微服务

目录 认识微服务 单体服务架构的特点 分布式架构的特点 微服务 SpringCloud 总结 服务拆分及远程调用 服务拆分原则 假如在订单服务中&#xff0c;需要一起返回用户的信息 Eureka注册中心 Eureka的结构和作用 问题&#xff1a;order-service如何得知user-service实例…

基于拓扑的单树分割用于地面激光扫描点云的自动处理

Paper题目&#xff1a;Topology-based individual tree segmentation for automated processing of terrestrial laser scanning point clouds ABSTRACT 地面激光扫描 (TLS) 是一种基于地面的方法&#xff0c;可通过光探测和测距 (LiDAR) 技术快速获取 3D 点云。从 TLS 点云量…

搜索引擎关键字智能提示实践

为了提高阅读体验&#xff0c;请移步到&#xff1a;搜索引擎关键字智能提升实践一、背景搜索关键字智能提示是一个搜索应用的标配&#xff0c;主要作用是避免用户输入错误的搜索词&#xff0c;并将用户引导到相应的关键词上&#xff0c;以提升用户使用体验。雪球以连接人与资产…

【K8S之调度器流程和扩展】如何给 scheduler 添加扩展插件、关闭默认插件、创建多个 scheduler?

参考 自定义 Kubernetes 调度器 阳明https://github.com/cnych/sample-scheduler-extender kube-scheduler 源码位置 kubernetes 调度器的源码位于 kubernetes/pkg/scheduler 中&#xff0c;大体的代码目录结构如下所示&#xff1a;(不同的版本目录结构可能不太一样) kuber…

如何检测文章被搜索引擎收录(如何让搜索引擎收录网站)

如何写网站内容才利于搜索引擎收录 网站关键词要想有好的排名&#xff0c;网站本身必须是被搜索引擎收录的状态&#xff0c;另外&#xff0c;网站上的相关内容收录越多&#xff0c;搜索引擎给与网站关键词的排名靠前概率会越大&#xff0c;那么&#xff0c;网站内容怎样来写会…

[Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

文章目录生产者消费者模型函数调用角度理解生产者消费者模型生活角度理解生产者消费者模型为什么要使用生产者消费者模型生产者消费者模型优点321原则基于BlockingQueue的生产者消费者模型POSIX信号量回顾信号量概念信号量操作函数环形队列基于环形队列的生产者消费者模型生产者…