Rust 利用 Trait 实现多态性

在Rust中,Trait(特性)是一种强大的抽象机制,类似于其他编程语言中的接口或类型类。它们允许你定义一组方法,这些方法可以在任何实现该Trait的类型上调用。这使得Rust能够以一种非常灵活的方式支持多态性。

下面是一个简单的例子,展示了如何使用Trait在Rust中实现多态性:

  1. 定义Trait

首先,定义一个Trait,它包含你想要实现的方法。

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

这里我们定义了一个Shape Trait,它有两个方法:areaperimeter

  1. 实现Trait

然后,你可以在任何类型上实现这个Trait。例如,你可以为圆形和矩形定义这两个方法。

struct Circle {radius: f64,
}impl Shape for Circle {fn area(&self) -> f64 {std::f64::consts::PI * self.radius * self.radius}fn perimeter(&self) -> f64 {2.0 * std::f64::consts::PI * self.radius}
}struct Rectangle {width: f64,height: f64,
}impl Shape for Rectangle {fn area(&self) -> f64 {self.width * self.height}fn perimeter(&self) -> f64 {2.0 * (self.width + self.height)}
}

这里我们为CircleRectangle两个结构体实现了Shape Trait。

  1. 使用Trait实现多态性

现在,你可以使用Trait作为函数参数的类型,从而接受任何实现该Trait的类型。这就是多态性的体现。

fn print_area_and_perimeter<T: Shape>(shape: &T) {println!("Area: {}", shape.area());println!("Perimeter: {}", shape.perimeter());
}fn main() {let circle = Circle { radius: 5.0 };let rectangle = Rectangle { width: 4.0, height: 6.0 };print_area_and_perimeter(&circle);print_area_and_perimeter(&rectangle);
}

在这个例子中,print_area_and_perimeter函数接受一个实现了Shape Trait的类型的引用。因此,它可以接受CircleRectangle类型的参数,并调用它们的areaperimeter方法。这就是多态性的体现:同一个函数可以用于处理多种不同的类型。

总的来说,Rust的Trait提供了一种强大而灵活的方式来实现多态性,允许你在不同的类型上定义和使用共同的行为。

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

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

相关文章

2.2 HTML5保留的常用标签

2.2.1 基础标签 1. 段落标签<p> 段落标签<p>和</p>用于形成一个新的段落&#xff0c;段落与段落之间默认为空一行进行分割。 2. 标题标签<h1>-<h6> HTML5使用<hn>和</hn>来标记文本中的标题&#xff0c;其中n需要替换为数字&#x…

使用insightface 识别人脸性别和年龄

一、背景 这个库蛮强大的&#xff0c;能识别人脸的性别和年龄吗&#xff0c;可以 二、步骤 1、把下面保存为test.py import argparse import cv2 import sys import numpy as np import insightface from insightface.app import FaceAnalysis from insightface.data import…

腾讯云对象存储的在Java使用步骤介绍

腾讯云对象存储的在Java使用步骤介绍 创建一个腾讯云的账户 这个自己去创建&#xff0c;然后开通对象存储服务&#xff0c;如下 有了账号就要创建一个对象存储的桶&#xff0c;也就是存储对象的一个容器 如果你想只有自己放存放的就设置 私有读写 &#xff0c;如果想用网络直…

JavaScript 迭代器和生成器

迭代器&#xff08;Iterator&#xff09; 迭代器是一种特定的设计模式&#xff0c;用于依次访问集合的元素而不必暴露其底层的表现形式。ECMAScript 6&#xff08;ES6&#xff09;引入了内建的迭代器&#xff0c;该标准定义了Iterable和Iterator协议。 Iterable协议 任何对象…

webstorm如何调试uniapp项目

1、webstorm安装Uniapp Tool项目&#xff0c;并根据要求配置Hbuilder和微信开发者工具&#xff1b; 2、运行/调试配置 3、运行uniapp项目&#xff0c;然后运行调试即可愉快的在webstorm上加断点调试了

Hystrix的原理及应用:构建微服务容错体系的利器(一)

本系列文章简介&#xff1a; 本系列文章旨在深入剖析Hystrix的原理及应用&#xff0c;帮助大家理解其如何在微服务容错体系中发挥关键作用。我们将从Hystrix的核心原理出发&#xff0c;探讨其隔离、熔断、降级等机制的实现原理&#xff1b;接着&#xff0c;我们将结合实际应用场…

【技术类-03】python实现docx表格文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示——docx表格内的手动换行符更改硬回车 背景需求&#xff1a; 这篇成功把docx文本段落&#xff08;无表格&#xff09;中的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;。 【技术类-02】python实现docx段落文字的“手…

实践疑惑 | 使用pandas库读取文件,与直接使用read()函数读取文件相比,有何不同?

使用 &#xff08;一&#xff09;pandas import pandas as pd# xlsx和xls data pd.read_excel(rfile_path)# csv data pd.read_csv(rfile_path)&#xff08;二&#xff09;read函数 # 使用open函数打开文件 file open(filename.txt, r) # r表示读取模式 # 使用read函数…

企业内部培训考试系统单场培训会议解决方案

企业日常内训中&#xff0c;有些时候也会组织会议培训&#xff0c;再按照会议日程分上下午签到进行培训考勤&#xff0c;并形成培训签到表&#xff0c;如果用活动报名工具&#xff0c;一般只能实现单次的签到考勤&#xff0c;如果用培训班系统则操作过于繁琐&#xff0c;不利于…

子查询 封装属性创建Connection连接类 数据库连接池

子查询 在select语句中包含另一个select 语句 -->子查询 子查询的分类 单行单列子查询 在where子句中使用 运算符 ! > < -- 查询工资比公司平均工资高的员工信息 -- 查询与员工’smith‘同职位的员工信息 -- 查询比员工joins入职…

Python凝聚层次聚类算法

凝聚层次聚类&#xff08;Agglomerative Hierarchical Clustering&#xff09;是一种自底向上的聚类方法。它首先将每个对象看作是一个单独的簇&#xff0c;然后按照某种准则&#xff08;如距离&#xff09;逐渐合并这些簇&#xff0c;直到满足某个终止条件&#xff08;如达到预…

Solidity Uniswap V2 library contract

library contract 在 Solidity 中&#xff0c;库是一种无状态合约&#xff08;即它没有可变状态&#xff09;&#xff0c;它实现了一组可被其他合约使用的函数--这是库的主要目的。与合约不同&#xff0c;库没有状态&#xff1a;它们的函数通过 DELEGATECALL 在调用者的状态下…

工业制造领域系统:SCADA、PLC、DCS、MES、HMI、ERP等,一文秒懂

工业制造控制系统在工业制造领域起到了关键的作用&#xff0c;帮助企业提高生产效率、降低成本、提高产品质量和安全性。不同的企业根据自身需求和规模&#xff0c;可能会选择使用其中的一种或多种系统。 SCADA系统&#xff08;Supervisory Control and Data Acquisition&…

数据和类型转换

文章目录 数据类型数字类型数字操作NaNJavaScript算术运算符的执行顺序 字符串类型&#xff08;string&#xff09;字符串拼接模板字符串 未定义类型&#xff08;undefined&#xff09;布尔类型&#xff08;boolean&#xff09;null&#xff08;空类型&#xff09; 类型转换显式…

【DL经典回顾】激活函数大汇总(十三)(Sinc SwiGLU附代码和详细公式)

激活函数大汇总&#xff08;十三&#xff09;&#xff08;Sinc & SwiGLU附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…

Unity开发一个FPS游戏之二

在之前的文章中,我介绍了如何开发一个FPS游戏,添加一个第一人称的主角,并设置武器。现在我将继续完善这个游戏,打算添加敌人,实现其智能寻找玩家并进行对抗。完成的效果如下: fps_enemy_demo 下载资源 首先是设计敌人,我们可以在网上找到一些好的免费素材,例如在Unity…

2024年华为OD机试真题-田忌赛马-Java-OD统一考试(C卷)

题目描述: 给定两个只包含数字的数组a,b,调整数组 a 里面数字的顺序,使得尽可能多的 a[i] >b[i]。数组 a和 b 中的数字各不相同。 输出所有可以达到最优结果的 a 数组的数量 输入描述: 输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a…

KKView远程控制: todesk内网穿透

Todesk内网穿透&#xff1a;实现远程访问的新途径 在数字化时代&#xff0c;远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件&#xff0c;其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【C++ 】list 类

1. 标准库中的list类 list 类 的介绍&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单链表 3. 与其他的序列式容器相比(a…