Rust dyn - 动态分发 trait 对象

news2024/11/24 9:15:59

dyn - 动态分发 trait 对象

dyn是关键字,用于指示一个类型是动态分发(dynamic dispatch),也就是说,它是通过trait object实现的。这意味着这个类型在编译期间不确定,只有在运行时才能确定。

  • practice

trait object实现多态性。
假设有一个几何图形的类层次结构,例如圆形(Circle)和矩形(Rectangle),每种几何图形都有一个计算面积的方法。定义trait Shape来表示这个特征,并在每个几何图形中实现这个trait。

trait Shape {
    fn area(&self) -> f64;
}

struct Circle {
    radius: f64,
}

impl Shape for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }
}

struct Rectangle {
    width: f64,
    height: f64,
}

impl Shape for Rectangle {
    fn area(&self) -> f64 {
        self.width * self.height
    }
}

现在编写一个函数,可以计算不同类型几何图形的总面积。我们可以使用trait object来实现这个函数:

fn total_area(shapes: &[&dyn Shape]) -> f64 {
    let mut total = 0.0;
    for shape in shapes {
        total += shape.area();
    }
    total
}

&[&dyn Shape]类型的参数来接受几何图形的数组。数组中的每个元素都是一个对实现Shape trait的具体类型的引用。使用for循环遍历这个数组,并对每个元素调用area方法,计算它的面积,并将结果累加到总面积中。

创建一些具体的几何图形实例,并将它们传递给total_area函数,以计算它们的总面积:

fn main() {
    let shapes: Vec<&dyn Shape> = vec![
        &Circle { radius: 1.0 },
        &Rectangle { width: 3.0, height: 4.0 },
        //&Circle { radius: 1.5 },
    ];
    let total = total_area(&shapes);
    println!("Total area: {}", total);
}

输出结果正确:
在这里插入图片描述

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

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

相关文章

阿里云ECS部署Mysql数据库

说明 首先需要到阿里云官方购买阿里云产品 &#xff0c;如果有机会可以免费试用那会更好&#xff0c;跳过购买云服务步骤下面直接演示。 一、阿里云官网示意图 1.百度搜索 阿里云官方 2.点击控制台 3.展开更多 4. 选择云服务器ECS 5. 点击实例 可以看到服务器状态&#xff…

利用 USB 设备重定向实现无缝远程办公

随着当代工作环境的不断发展&#xff0c;对有效的、无缝的远程办公解决方案的需求日益增长。无论是创意人员、高级用户&#xff0c;还是游戏爱好者&#xff0c;能够随时随地工作或玩游戏都是一项显著优势。 但通常&#xff0c;这不仅需要能够远程访问工作站。创意人员和高级用…

Mybatis-Flex 是一个优雅的 Mybatis 增强框架

Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时&#xff0c;减少出错的可能性。 总而…

初识mysql数据库之MVCC机制与视图

目录 一、数据库的三种并发场景 二、 MVCC 1. 建立共识 2. MVCC的作用 3. MVCC的三个前置知识 3.1 3个记录隐藏列字段 3.2 undo日志&#xff08;undo log&#xff09; 4. 模拟MVCC 4.1 图示模拟状况 4.2 不同操作的历史版本链形成 5. 当前读与快照读 6. 为什么要有…

QT实现中英文键盘

使用Qt中实现中英文键盘&#xff0c;支持各种linux嵌入式设备。 实现思路&#xff1a;需要一个中文字体库&#xff0c;将字体库加载到一个Hash容器&#xff0c;字母和拼音作为key值&#xff0c;对应的中文作为value值。 核心代码&#xff1a; #include "UKeyBoard.h"…

出海新篇章:品牌规划方法与海外市场拓展

品牌出海规划是确保企业在国际市场上获得成功的关键步骤&#xff0c;它涉及到对目标市场的深入研究和了解&#xff0c;同时需要明确的策略和目标。本文Nox聚星将和大家探讨品牌出海规划的关键要素&#xff0c;为品牌出海提供一些建议和指导。 一、市场调研与定位 在品牌出海之…

C++基础篇 第七天 异常、智能指针、nullptr,auto

目录 异常 异常概念&#xff1a; C和C中异常的区别 异常处理 1. throw抛出异常 2. try...catch 进行异常处理 3.try...catch抛出自建类的异常 4.自建类的异常延伸 捕获的扩展 提高异常捕获的概率 智能指针 auto_ptr&#xff08;已废弃&#xff0c;只做了解&#xf…

【工具使用】git基础操作1

目录 一.拉取git代码1.首次拉取命令2.使用图形化拉取代码3.Idea 开发工具拉取代码 二.查看当前状态1.查看在你上次提交之后是否有对文件进行再次修改 三.创建分支3.1.创建分支3.2.创建分支并切换至分支3.3.提交分支至远程仓 远程没有自动创建 四.查看分支4.1.查看本地分支 当前…

智慧园区项目:数字化引领城市转型

随着科技的迅猛发展&#xff0c;智慧园区项目正日益成为城市数字化转型的关键组成部分。这些智慧园区项目借助先进的技术&#xff0c;将传统的园区升级为智能化、数字化的生态系统&#xff0c;为城市的可持续发展和人们的生活质量带来了巨大的变革。 在智慧园区项目中&#xff…

别不信,这才是交换机组网的正确打开方式

下午好&#xff0c;我的网工朋友。 俱乐部更新交换机和路由器相关技术点一直是更新得非常勤快&#xff0c;懂的朋友都懂&#xff0c;毕竟知识点太多。这不&#xff0c;前两天刚说一篇。 之前我们聊过交换机的配置命令&#xff0c;选型关键&#xff0c;配置步骤&#xff0c;部…

C语言数组笔试题(详解)

目录 插入知识&#xff1a; 一.指向函数指针数组的指针 二.回调函数 什么是回调函数&#xff1f; 三.数组笔试题 个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#xff1a;GOTXX &#x1f4…

概率论与数理统计复习总结2

概率论与数理统计复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《概率论与数理统计》/ 荣腾中主编. — 第 2 版. 高等教育出版社《2024高途考研数学——概率基础精讲》王喆 概率论与数理统计实际上是两个互补的分支&#xff1a;概率论 在 已知随机…

亚像素到底能不能提高精度

01.什么是亚像素 亚像素(Sub Pixel),是面阵摄像机的成像面以像素为最小单位。 像素中心之间的距离有几个至十几个微米不等。为了最大限度利用图像信息来提高分辨率,有人提出了亚像素概念。意思是说,在两个物理像素之间还有像素,称之为亚像素,它完全是通过计算方法得出来的。…

three.js实现vr全景图(vue)

方法: 可以利用Threejs中的立方体或者球体实现全景图功能&#xff0c;把立方体或球体当成天空盒子&#xff0c;将无缝衔接的图片贴上&#xff0c;看起来就像在一个场景中&#xff0c;相机一般放置在中央。 three.js中文网 1、立方体实现 立方体6个面要贴上6个方向的图片&…

在 React 中渲染大型数据集的 3 种方法

随着 Web 应用程序变得越来越复杂&#xff0c;我们需要找到有效的方法来优化性能和渲染大型数据集。在 React 应用程序中处理大型数据集时&#xff0c;一次呈现所有数据可能会导致性能不佳和加载时间变慢。 虚拟化是一种通过一次仅呈现数据集的一部分来解决此问题的技术&#…

AIGC产业公司简况列表

最近梳理了国内外AIGC产业链相关的公司列表&#xff0c;如下图所示&#xff1a; 出自&#xff1a;AIGC产业公司简况列表 | 秋天的童话博客

ElementUI el-table 鼠标滚动失灵的问题及解决办法

Bug&#xff1a;ElementUI el-table 鼠标滚轮下滑动失灵的情况 我测出来的这个问题条件很苛刻&#xff0c;需要达到以下几个条件才会触发&#xff1a; 1.element plus&#xff08;其他版本没试&#xff09; 2.el-table-column组件有fixed属性时 3.template标签中有el-butto…

Adobe ColdFusion 反序列化漏洞复现(CVE-2023-29300)

0x01 产品简介 Adobe ColdFusion是美国奥多比&#xff08;Adobe&#xff09;公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion存在代码问题漏洞&#xff0c;该漏洞源于受到不受信任数据反序列化漏洞的影响&#xff0c;攻击…

赶快卸载 Navicat和DataGrip吧,阿里又开源了一款数据库神器,太炸了

Chat2DB 是一款有开源免费的多数据库客户端工具&#xff0c;支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力&#xff0c;能够将自然语言转换为SQL&#xff0c;也可以…

eclipse was unable to locate its companion shared library

当转移或者Copy工程时&#xff0c; eclipse was unable to locate its companion shared library eclipse.ini 里面的路径配置错误导致 --launcher.library C:/Users/**/.p2/pool/plugins/org.eclipse.equinox. launcher.win32.win32.x86_64_1.2.700.v20221108-1024 -product …