【Rust】18. Rust 的面向对象特性

news2025/1/12 1:52:16

18.1 面向对象语言的特征

18.1.1 对象:数据 + 行为

在这里插入图片描述

18.1.2 封装隐藏了实现细节

  • 在 Rust 中,在代码中不同的部分考虑使用 pub 可以封装其实现细节

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

18.1.3 继承,作为类型系统与代码共享

  • 在 Rust 中,不存在继承的机制,而是使用 trait 对象来提供相关的功能

在这里插入图片描述

18.2 trait 对象

  • 已知全部的数据类型时,可以使用固定集合(枚举);但当全部的数据类型不是已知时(会动态变化),就需要使用 trait 对象来实现了

在这里插入图片描述

18.2.1 trait 对象(是一个实例):定义通用行为

  • trait 对象:指向一个实现了指定 trait 类型的实例,以及一个用于在运行时查找该类型的 trait 方法的表
  • 通过指定某种**指针(& 引用或 Box<T> 智能指针,还有 dyn 关键字)**来创建 trait 对象
  • 可以使用 trait 对象代替泛型或具体类型,无需在编译时就知晓所有可能的类型
  • trait 对象将数据和行为两者相结合(不同于传统的对象,不能向 trait 对象增加数据),trait 对象的作用是允许对通用行为进行抽象
  • 对比泛型类型:泛型类型参数一次只能替代一个具体类型,而 trait 对象则允许在运行时替代多种具体类型

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

18.2.2 实现 trait

  • 将一个或多个类型的实例放入 Box<T>就可以转换得到 trait 对象!
  • 使用 trait 对象和 Rust 类型系统来进行类似鸭子类型操作的优势是无需在运行时检查一个值是否实现了特定方法或者担心在调用时因为值没有实现方法而产生错误。如果值没有实现 trait 对象所需的 trait 则 Rust 不会编译这些代码

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

18.2.3 trait 对象执行动态分发

在这里插入图片描述

18.2.4 trait 对象需要类型安全

  • 只有**对象安全(object-safe)**的 trait 可以实现为特征对象
  • 如果一个 trait 中定义的所有方法都符合以下规则,则该 trait 是对象安全的:1、返回值不是 Self;2、没有泛型类型的参数
  • 核心原因:一旦使用 trait 对象,Rust 将不再知晓该实现的返回类型!

在这里插入图片描述

18.3 面向对象设计模式的实现

18.3.1 状态模式

  • 状态模式(state pattern):是一个面向对象设计模式,该模式的关键在于定义一系列值的内含状态,这些状态体现为一系列的状态对象,同时值的行为随着其内部状态而改变
  • 状态对象共享功能
  • 每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。而持有一个状态对象的值,对于不同状态的行为以及何时状态转移毫不知情

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

18.3.2 博客项目(一):定义 Post 并新建一个草案状态的实例

在这里插入图片描述

18.3.3 博客项目(二):存放博文内容的文本

  • 对于需要修改的字段需要传入可变引用 &mut self

在这里插入图片描述

18.3.4 博客项目(三):确保博文草案的内容是空的

在这里插入图片描述

18.3.5 博客项目(四):请求审核博文来改变其状态

  • 代码解析:if let Some(s) = self.state.take() 表示先取出当前 state 的值及其所有权,再给到中间变量 ss 再根据实际获取到的 state 值调用对应的 request_review 方法(即判断是属于 Draft 还是 PendingReviewrequest_review
  • 在这里来看看状态模式的优势:无论 state 是何值,Post 的 request_review 方法都是一样的。每个状态只负责它自己的规则

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

18.3.6 博客项目(五):增加改变 content 行为的 approve 方法

  • 调用 Optionas_ref 方法是因为需要 Option值的引用而不是获取其所有权
  • 在下面的示例中,获取到的 &Box<dyn State>,当调用其 content 时,Deref 强制转换会作用于 &Box
  • 在下面的示例中,获取 post 的引用作为参数,并返回 post 一部分的引用,所以返回的引用的生命周期与 post 参数相关

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

18.3.7 状态模式的权衡取舍

  • 状态模式的优点:Post 的方法和使用 Post 的位置无需 match 语句,同时增加新状态只涉及到增加一个新 struct 和为其实现 trait 的方法
  • 状态模式的缺点:因为状态实现了状态之间的转换,一些状态会相互联系会有一些重复的逻辑(可通过默认方法、定义宏等方法来解决)

在这里插入图片描述

18.3.8 博客项目-改造(一):将状态和行为编码为类型

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

18.3.9 博客项目-改造(二):实现状态转移为不同类型的转换

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

18.4 小结

在这里插入图片描述

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

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

相关文章

【C++11】初始化列表、decltype操作符、nullptr

目录 一、初始化列表 1.1 花括号初始化 1.2 initializer_list 二、decltype 三、nullptr 一、初始化列表 1.1 花括号初始化 在C98中&#xff0c;标准允许使用花括号{ }对数组或结构体元素进行统一的列表初始值设定。 而在C11推出后&#xff0c;使用初始化列表时&#x…

java的方法使用

1.方法概述1.1什么是方法方法(method)是将具有独立功能的代码块组织成为一个整体&#xff0c;使其具有特殊功能的代码集注意&#xff1a;方法必须先创建才可以使用&#xff0c;该过程称为方法定义方法创建后并不是直接运行的&#xff0c;需要手动使用后才执行&#xff0c;该过程…

深入理解mysql性能优化以及解决慢查询问题

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

GPT1、GPT2、GPT3原理

一 背景 GPT1:Generative Pre-Training。是一种生成式的预训练模型,由OpenAi团队发表自论文《Improving Language Understanding by Generative Pre-Training》。 h0=UWe+Wp 二 模型整体结构(宏观) 图1 GPT整体结构 左侧为模型的整体结构,由12个Transformer中的Decoder模块…

App的分类与简析

引言随着智能手机的普及&#xff0c;移动端应用几乎成为每个互联网产品的标配。在快速迭代的互联网战场中高效开发、低成本上线产品&#xff0c;是每个应用开发团队追求的目标。此时&#xff0c;选择合适的应用类型和开发模式便至关重要。移动应用可以粗分为三种&#xff1a;原…

Hystrix线程池隔离与接口限流

前面了解了Hystrix的请求缓存、fallback降级、circuit breaker断路器快速熔断,下面来看下Hystrix的线程池隔离与接口限流。 Hystrix通过判断线程池或者信号量是否已满,超出容量的请求,直接Reject走降级,从而达到限流的作用。限流是限制对后端服务的访问量,比如对MySQL、Re…

CentOS7 LVM 逻辑卷2种读写策略(磁盘IO性能优化)—— 筑梦之路

LVM 逻辑卷的读写策略有两种&#xff1a; linear&#xff1a;线性方式&#xff0c;一块块盘来读写&#xff0c;写完一块盘再写第二块盘、第 N 块盘&#xff0c;性能低striped&#xff1a;条带方式&#xff0c;多块盘一起并行读写&#xff0c;性能高查看 LVM 逻辑卷的读写策略的…

元宇宙,会成为下一代互联网的主场吗?

导语 | 2022 年元宇宙风靡全网&#xff0c;作为过去一年科技界的“当红扛把子”&#xff0c;引多家科技巨头“竞折腰”。近日&#xff0c;《福布斯》双周刊网站在报道中指出&#xff0c;2030 年全球元宇宙的市场规模有望高达 5 万亿美元&#xff0c;2023 年可能是确定其发展方向…

机器学习0 — 总体架构,chatgpt时代必须掌握的

1 从chatgpt看目前AI重要性 随着chatgpt的一声巨响&#xff0c;拉响了强人工智能的序幕。chatgpt相对于目前的各种机器人&#xff0c;简直就是弓箭和导弹的区别。沉寂了两三年后&#xff0c;AI如今又一次站在了人类工业的最高舞台。个人认为AI已经成为所有人&#xff0c;特别是…

vitest第二章(入门)

Vitest 是一个由 Vite 提供支持的极速单元测试框架 tips vite>3 node>14 安装 1.使用npm init -y 生成 package json 2.安装依赖 挑选一种即可 npm install -D vitestyarn add -D vitestpnpm add -D vitest3.新建一个文件calc.ts 开始第一个单元测试吧&#xff0c;…

【数据结构和算法】使用数组的结构实现链表(单向或双向)

上文我们通过结构体的结构实现了队列、以及循环队列的实现&#xff0c;我们或许在其他老师的教学中&#xff0c;只学到了用结构体的形式来实现链表、队列、栈等数据结构&#xff0c;本文我想告诉你的是&#xff0c;我们可以使用数组的结构实现链表、单调栈、单调队列 目录 前言…

2022最火科技~AIGC

2022年最火的信息科技~AIGC 人工智能内容生成 趣讲大白话&#xff1a;输入几个词&#xff0c;立刻生成机器创造的内容 ************** 从人工智能决策 走向 人工智能生成 人工智能决策&#xff1a;自动驾驶、抖音推荐算法 人工智能生成内容&#xff1a;即AI Generated Conten…

【算法练习】两个链表的第一个公共节点

描述输入两个无环的单向链表&#xff0c;找出它们的第一个公共结点&#xff0c;如果没有公共节点则返回空。&#xff08;注意因为传入数据是链表&#xff0c;所以错误测试数据的提示是用其他方式显示的&#xff0c;保证传入数据是正确的&#xff09;数据范围&#xff1a; 0n≤1…

下一代编解码技术Ali266在视频超高清领域的应用展望

超高清与各领域的需求融合和创新正在发生。 2022年是一个体育大年&#xff0c;众多世界级体育赛事通过视频直播、转播等形式给观众带来畅爽的观看体验。 2022年北京冬奥会&#xff0c;实现了奥运会历史上首次赛事全程4K制作播出&#xff0c;并在开幕式上提供了8K超高清公共信号…

安全多方计算之五:零知识证明(从入门到入土。。)

零知识证明1. 简介2. 零知识证明的例子2.1 向红绿色盲证明红球、绿球2.2 数独的零知识证明2.3 三染色问题的零知识证明2.4 Quisquater-Guillou 零知识协议3. ElGamal加密的零知识证明3.1 ElGamal加密的已知明文证明3.2 ElGamal加密的二选一零知识证明3.3 ElGamal加密的1-out-of…

MATLAB - 查找数据峰值

语法如下&#xff1a; pks findpeaks(data) [pks,locs] findpeaks(data) [pks,locs,w,p] findpeaks(data) [___] findpeaks(data,x) [___] findpeaks(data,Fs) [___] findpeaks(___,Name,Value) findpeaks(___)where&#xff0c;pks是峰值返回值&#xff0c;locs是数据索…

特斯拉 FSD 背后的技术(1)—从 BEV 到占用网络

在今年 tesla 的 AI Day 给我这个业余自动驾驶爱好者给留下了深刻印象&#xff0c;在看过之后&#xff0c;通过收集资料对其中阐述的技术进行简单的了解&#xff0c;在这里拿出来跟大家分享一下&#xff0c;有点长&#xff0c;所以划分了一下 3 个部分。从 BEV 到占用网络激进无…

chrome查看网页性能

1 Performance 1.1 打开开发者工具&#xff08;cmdshiftc&#xff09; 1.2 打开Performance面板&#xff0c;点击录制按钮&#xff08;开始录制&#xff09; 1.3 刷新页面&#xff0c;再次点击录制按钮&#xff08;结束录制&#xff09; 录制按钮高亮&#xff0c;表示录制中…

算法训练营DAY47|198.打家劫舍、213.打家劫舍II 、337.打家劫舍III

这一期到了打家劫舍的专题&#xff0c;说是专题但实际上只有一期&#xff0c;而且只有三道题&#xff0c;我们把这三道题放在一起讲&#xff0c;第一道题简单一些&#xff0c;后两道略有不同方向上的难度。但总体来看第一次做可能有一点难想到思路&#xff0c;其实代码实现还是…

百度、字节终于不再相互“抄袭”

文|智能相对论作者|佘凯文“百度和字节跳动&#xff0c;分道扬镳”乍一看挺标题党的&#xff0c;这两个互联网巨头从没在一起过&#xff0c;又何来“分道扬镳”之说&#xff1f;不急&#xff0c;且往下看。众所周知&#xff0c;当前国内互联网行业&#xff0c;早已不是当初啥也…