恋爱脑学Rust之dyn关键字的作用

在这里插入图片描述

在 Rust 语言中,dyn 关键字允许我们在使用特征时创建“动态派发”——即通过一个统一的接口操作多种类型的具体实现。可以把它理解成一种“浪漫的妥协”:当我们不知道未来会爱上谁,只知道对方一定具有某种特征时,dyn 就像一个协议,让我们可以和“潜在的爱人们”沟通,而不需要具体知道他们的具体样子或独特的个性。

想象一个浪漫的故事:小明认为爱很美好,但他不拘泥于具体的对象,只希望能找到任何一种和他有共同话题的人。他的标准是,对方只要能表现出特定的“特质”,比如温柔、幽默、冒险等就可以。但是小明并不能提前知道他会碰到的类型(他可能今天遇到温柔型的恋人,明天碰到幽默型的,或者还会遇到冒险型的)。dyn 在这里扮演的就是一个能让小明与多种类型的“恋人”交流的通用接口。

而如果小明没有使用 dyn,他就必须清楚地知道恋人的具体类型和样貌,结果就是每次都只能选择一个固定的对象类型,失去了灵活性。让我们来看一个代码例子来帮助理解。

dyn 的基本意图

在 Rust 中,dyn 关键字的目的是提供一种让代码能够处理不同类型的对象,而不需要预先知道它们的具体类型的方式。通过 dyn 特征对象,小明可以通过单一接口和不同类型的“恋人”互动。以下例子中,我们模拟小明遇到不同类型恋人的场景。

示例代码

我们定义一个通用特征 Lover,每个实现 Lover 的类型都有自己表达爱的方式。我们可以选择使用 dyn Lover 或不使用 dyn Lover

// 定义一个特征,描述不同类型的“恋人”
trait Lover {fn express_love(&self);
}// 定义几种具体的恋人类型
struct Gentle;
struct Adventurous;
struct Funny;// 实现不同恋人的特征
impl Lover for Gentle {fn express_love(&self) {println!("温柔型恋人:我会为你做一切,让你感到温暖");}
}impl Lover for Adventurous {fn express_love(&self) {println!("冒险型恋人:我们去环游世界吧!");}
}impl Lover for Funny {fn express_love(&self) {println!("幽默型恋人:我们一起大笑,过有趣的生活吧!");}
}// 小明与恋人交流的函数
fn love_story(lover: &dyn Lover) {lover.express_love();
}

使用 dyn 正确运行

小明会在接下来的故事中遇到不同的恋人类型,这些类型各不相同,但是通过 dyn,小明可以使用相同的函数 love_story 和他们交流。

fn main() {let gentle = Gentle;let adventurous = Adventurous;let funny = Funny;// 使用 dyn 特征对象love_story(&gentle);love_story(&adventurous);love_story(&funny);
}

运行结果:

温柔型恋人:我会为你做一切,让你感到温暖
冒险型恋人:我们去环游世界吧!
幽默型恋人:我们一起大笑,过有趣的生活吧!

小明成功与每种类型的恋人进行了互动,这就是 dyn 提供的动态派发功能,通过一个接口应对多种类型。

如果不使用 dyn 会发生什么?

如果小明尝试在没有使用 dyn 的情况下操作不同类型的恋人(例如,将恋人放在一个向量中),就会遇到编译错误,因为 Rust 无法确定在没有使用 dyn 的情况下如何存储不同类型的对象。

fn main() {// Rust 会报错,因为 Vec 不知道如何存储多种不同的类型let lovers: Vec<&Lover> = vec![&Gentle, &Adventurous, &Funny];for lover in lovers {love_story(lover);}
}

错误信息:

error[E0308]: mismatched types--> src/main.rs:5:32|
5   |     let lovers: Vec<&Lover> = vec![&Gentle, &Adventurous, &Funny];|                                  ^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `Lover`, found struct `Gentle`|= note: expected reference `&Lover`found reference `&Gentle`

总结

dyn 就像一个协议,允许小明(Rust 程序)和各种不同的对象(不同恋人类型)进行交流,而无需提前知道他们的具体类型。如果不使用 dyn,则程序需要对所有类型一一指定,缺乏灵活性,并且会导致编译错误。

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

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

相关文章

android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址

Android 浏览器是一种运行在Android操作系统上的应用程序&#xff0c;主要用于访问和查看互联网内容。以下是关于Android浏览器的详细介绍&#xff1a; 1. 基本功能 Android浏览器提供了用户浏览网页的基本功能&#xff0c;如&#xff1a; 网页加载&#xff1a;支持加载静态…

Sketch下载安装,中文版在线免费用!

Sketch是一款轻便、高效的矢量设计工具&#xff0c;全球众多设计师借助它创造出了无数令人惊叹的作品。Sketch在下载安装方面&#xff0c;其矢量编辑、控件以及样式等功能颇具优势&#xff0c;不过&#xff0c;Sketch中文版即时设计在下载安装方面也毫不逊色。即时设计是一个一…

Golang | Leetcode Golang题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; func countArrangement(n int) int {f : make([]int, 1<<n)f[0] 1for mask : 1; mask < 1<<n; mask {num : bits.OnesCount(uint(mask))for i : 0; i < n; i {if mask>>i&1 > 0 && (num%(i1) 0 |…

8进制在线编码工具--实现8进制编码

具体前往&#xff1a;文本转八进制在线工具-将文本字符串转换为8进制编码,支持逗号&#xff0c;空格和反斜杠分隔符

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …

SpringBoot【实用篇】- 配置高级

文章目录 目标&#xff1a;1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标&#xff1a; ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…

QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员&#xff0c;希望了解2D、3D相机视觉相关操作…

数字ic/FPGA,Windows/Linux系统,其他相关领域,软件安装包(matlab、vivado、modelsim。。。)

目录 一、总述 二、软件列表 1、modelsim_10.6c 2、notepad 3、matlab 4、Visio-Pro-2016 5、Vivado2018 6、VMware15 7、EndNote X9.3.1 8、Quartus 9、pycharm 10、CentOS7-64bit 一、总述 过往发了很多数字ic设计领域相关的内容&#xff0c;反响也很好。 最近…

【5.5】指针算法-三指针解决颜色分类

一、题目 给定一个包含红色、白色和蓝色&#xff0c;一共n个元素的数组&#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 此题中&#xff0c;我们使用整数0、1和2分别表示红色、白色和蓝色。 示例 1&#xff1…

刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:

控制文件是Oracle 数据库用来查找数据库文件&#xff0c;控制文件包含以下哪些信息&#xff1a; A 表空间信息 B 创建数据库的时间戳 C 有关数据文件、 联机重做日志文件、和归档重做日志文件的信息 D 数据库名称和数据库唯一标识符&#xff08;DBID) E RMAN备份…

3. 探索 Netty 的粘包与拆包解决方案

序言 在网络编程中&#xff0c;粘包和拆包现象常常是开发者在数据传输时遇到的棘手问题。如果消息在传输过程中没有正确的分包和组合&#xff0c;接收方可能会收到一组拼接在一起的数据&#xff08;粘包&#xff09;&#xff0c;或者一条消息被拆分成了不完整的部分&#xff0…

由浅入深逐步理解spring boot中如何实现websocket

实现websocket的方式 1.springboot中有两种方式实现websocket&#xff0c;一种是基于原生的基于注解的websocket&#xff0c;另一种是基于spring封装后的WebSocketHandler 基于原生注解实现websocket 1&#xff09;先引入websocket的starter坐标 <dependency><grou…

电信诈骗升级到了 FaceTime

最近&#xff0c;网上有消息称一些不法分子正在通过FaceTime来冒充微信、京东等平台的客服&#xff0c;骗取用户转移账号内的资金&#xff0c;或是申请贷款。 虽然从具体的诈骗方式来说还是老一套&#xff0c;但是却更加防不胜防&#xff0c;而且欺诈性更强&#xff0c;特别是…

‌5G SSB(同步信号块)位于物理层‌

‌5G SSB&#xff08;同步信号块&#xff09;位于物理层‌。在5G NR中&#xff0c;SSB由主同步信号&#xff08;PSS&#xff09;、辅同步信号&#xff08;SSS&#xff09;和物理广播信道&#xff08;PBCH&#xff09;组成&#xff0c;这些信号共同构成了SSB。SSB的主要功能是帮…

基于MATLAB驾驶行为的疲劳实时检测研究

[摘要]为了有效地检测出驾驶员的驾驶疲劳&#xff0c;本文设计了一种基于驾驶行为的实时疲劳驾驶检测模型。该算法选取与疲劳相关的驾驶行为指标&#xff0c;包括速度均值与标准差&#xff0c;加速度绝对均值与标准差&#xff0c;综合考虑报警设备的报警频率与驾驶时长来划分疲…

演练纪实丨 同创永益圆满完成10月份灾备切换演练支持

2024年10月&#xff0c;同创永益共支持5家客户圆满完成灾备切换演练&#xff0c;共涉及70多套核心系统总切换与回切步骤6000余个&#xff0c;成功率100%&#xff0c;RTO时长均达到客户要求。 其中耗时最短的一次演练仅花费约3个小时&#xff0c;共涉及32套系统的灾备切换演练&a…

Logback 常用配置详解

1. 配置文件解析 Logback 是 Spring Boot 默认使用的日志框架&#xff0c;Logback 配置主要包含 8 大元素 1.1 configuration Logback 配置文件的根元素&#xff0c;它包含所有的配置信息 1.2 appender 定义一个 Appender&#xff0c;即日志输出的目的地&#xff0c;如控制…

【AI日记】24.11.01 LangChain、openai api和github copilot

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 工作1 内容&#xff1a;学习deeplearning.ai的免费课程地址&#xff1a;LangChain Chat with Your DataB站地址&#xff1a;https://www.bilibili.com/video/BV148411D7d2时间&#xff1a;2小时评估&am…

#渗透测试#SRC漏洞挖掘# 操作系统-Linux系统

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

利用ExcelJS封装一个excel表格的导出

ExcelJS 操作和写入Excel 文件。 直接上代码&#xff0c;js部分&#xff1a; exportFn.js import ExcelJS from exceljs; import { saveAs } from file-saver;export function exportExcleUtils(tHeader, filterVal, listData, fileName) {//设置工作簿属性const workbook ne…