rust程序设计(4)关于 trait | impl 相关的概念和疑问
trait是什么?
Rust中的trait是一种定义可被多种类型实现的共享行为的方式。它类似于Java或C#中的接口。通过trait,你可以定义一组方法签名(有时包括默认实现),不同的类型可以实现这些方法。这有助于抽象通用功能并确保不同类型间一定程度的一致性。
当一个类型实现了一个trait,它承诺提供该trait中声明的方法的实现。这对于泛型编程非常有用,因为你可以编写能够操作任何实现特定trait的类型的函数和数据结构。
这里有一个基本的例子:
trait Speak {
fn speak(&self) -> String;
}
struct Dog;
impl Speak for Dog {
fn speak(&self) -> String {
"Woof!".to_string()
}
}
struct Cat;
impl Speak for Cat {
fn speak(&self) -> String {
"Meow!".to_string()
}
}
fn animal_sound<T: Speak>(animal: T) {
println!("{}", animal.speak());
}
fn main() {
let dog = Dog;
let cat = Cat;
animal_sound(dog);
animal_sound(cat);
}
在这个例子中,Speak是一个具有方法speak的trait。Dog和Cat结构体都实现了这个trait。函数animal_sound可以接受任何实现了Speak的类型。
如果一个 Rust 的 trait 定义了多个方法,当你为某个类型实现这个 trait 时,需要为这些方法提供具体实现。调用这些方法时,只需使用实现了该 trait 的类型的实例。
以下是一个扩展前面示例的例子,这次 Speak trait 包含两个方法:speak 和 can_fly。
rustCopy code
trait Speak {
fn speak(&self) -> String;
fn can_fly(&self) -> bool;
}
struct Dog;
impl Speak for Dog {
fn speak(&self) -> String {
"Woof!".to_string()
}
fn can_fly(&self) -> bool {
false
}
}
struct Bird;
impl Speak for Bird {
fn speak(&self) -> String {
"Tweet!".to_string()
}
fn can_fly(&self) -> bool {
true
}
}
fn main() {
let dog = Dog;
let bird = Bird;
println!("Dog says: {}", dog.speak());
println!("Can the dog fly? {}", dog.can_fly());
println!("Bird says: {}", bird.speak());
println!("Can the bird fly? {}", bird.can_fly());
}
在这个例子中,Dog 和 Bird 都实现了 Speak trait。每个实现都必须提供 speak 和 can_fly 方法的具体实现。在 main 函数中,我们创建了 Dog 和 Bird 的实例,并分别调用了它们的 speak 和 can_fly 方法。
如果 Rust 中的 trait 定义了一个方法且没有提供默认实现,那么任何实现该 trait 的类型都必须为这个方法提供具体的实现。Rust 编译器会强制这一规则,确保类型正确地实现了 trait 的所有要求。
rustCopy code
trait Speak {
fn speak(&self) -> String;
// 这是一个带有默认实现的方法
fn is_loud(&self) -> bool {
false
}
}
struct Dog;
// 对 Dog 实现 Speak trait
impl Speak for Dog {
fn speak(&self) -> String {
"Woof!".to_string()
}
// 我们选择不实现 is_loud 方法,所以使用默认实现
}
fn main() {
let dog = Dog;
println!("Dog says: {}", dog.speak());
println!("Is the dog loud? {}", dog.is_loud());
}
在这个例子中,Speak trait 有两个方法:speak 和 is_loud。is_loud 方法有一个默认实现,这意味着在为 Dog 类型实现 Speak trait 时,我们可以选择不为 is_loud 方法提供自己的实现,并使用默认实现。
rust 中的 impl 是什么?
在Rust中,impl是一个关键字,用于在类型上实现方法。它是将函数与特定类型(结构体或枚举)关联起来的一种方式。impl主要有两种用途:
实现方法:你可以为特定类型定义方法。然后可以在该类型的实例上调用这些方法。
示例:
rustCopy code
struct Rectangle {
width: u32,
height: u32,
} impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
在这个示例中,为
Rectangle结构体实现了一个名为area的方法,用于计算矩形的面积。实现特质(Traits):Rust中的特质(Trait)类似于其他语言中的接口。它们定义了类型必须提供的功能。使用
impl,你可以为特定类型实现一个特质,提供特质中定义的必要方法。示例:
rustCopy code
trait Describable {
fn describe(&self) -> String;
} impl Describable for Rectangle {
fn describe(&self) -> String {
format!("Rectangle of width {} and height {}", self.width, self.height)
}
}
在这里,为
Rectangle实现了Describable特质,提供了描述矩形的具体方式。
总之,在Rust中,impl用于为结构体或枚举定义方法以及为这些类型实现特质,实现了封装和多态性。
rust程序设计(4)关于 trait | impl 相关的概念和疑问的更多相关文章
- 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念
本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...
- linux设备驱动归纳总结(二):模块的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...
- linux设备驱动归纳总结(一)内核的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...
- 一、HTML概述 二、web相关的概念 三、HTML的常用标签
一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...
- WiFi相关基础概念
转自:https://blog.csdn.net/lbaihao/article/details/73250798 一.WiFi相关基础概念 1.什么是wifi 我们看一下百度百科是如何定义的: Wi ...
- (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结
1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...
- 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念
linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 与类相关基本概念----Beginning Visual C#
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- 【转】与BT下载相关的概念
1. DHT DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法.在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整 ...
随机推荐
- 在游戏运营行业,Serverless 如何解决数据采集分析痛点?
简介: 众所周知,游戏行业在当今的互联网行业中算是一棵常青树.在疫情之前的 2019 年,中国游戏市场营收规模约 2884.8 亿元,同比增长 17.1%.2020 年因为疫情,游戏行业更是突飞猛进. ...
- 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
简介: 阿里云 ESSD 为云服务器 ECS 提供低时延.持久性和高可靠的块存储服务,成为云厂商全闪块存储的业界标杆.存储团队推出了 ESSD Auto PL 新的云盘规格,把性能与容量解耦,提供 ...
- 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践
简介: Threat Hunting 平台的架构与设计,及以降低 IO 为目标的优化与探索.为什么以及如何使用块索引. 本文整理自 360 政企安全集团的大数据工程师苏军以及刘佳在 Flink For ...
- dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么
在 WPF 里面的 GlyphRun 里,有一个令人迷惑的 DeviceFontName 属性,似乎给这个属性传入什么值,结果都不会有变更.通过阅读源代码,可以了解到,这是一个没什么用途的属性.本文将 ...
- 读书笔记 dotnet 的字符串在内存是如何存放
本文是读伟民哥翻译的 .NET内存管理宝典 这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解.在阅读到 string 在内存的布局时,我看到 RuntimeHelper ...
- Echarts立体地图加3D柱图可点击可高亮选中的开发
注意 echarts请使用v5.1.0以上版本,低版本会无法显示,或者无法触发点击事件. 若有闪屏bug,不要设置temporalSuperSampling属性. 注意图层顺序. 实现原理 借助 ec ...
- Ubuntu VNC 远程桌面及常见问题
一.Ubuntu 远程桌面开启 在ubuntu 设置中打开远程桌面 **注意:如果没有共享桌面选项也不要谎,只需要安装 vino 即可 sudo apt update sudo apt install ...
- SAP集成技术(十三)SAP Cloud Integration
异构应用环境给IT带来了各种问题.在这种情况下,混合集成环境尤其受到影响.同时,对于建立在混合IT环境上的数字化转型项目,数据集成和跨系统访问已经开始发挥核心作用.为了满足不断增长的需求,SAP Bu ...
- 羽夏闲谈——NewCode
前言 在工作学习中,我配置好了一个VSCode,学习C语言,需要经常性的创建代码文件,而往往这里面有一个固定的模板,比如下面: #define _CRT_SECURE_NO_WARNINGS #i ...
- 【爬虫实战】用python爬小红书任意话题的笔记,以#杭州亚运会#为例
目录 一.爬取目标 二.爬虫代码讲解 2.1 分析过程 2.2 爬虫代码 三.演示视频 四.获取完整代码 一.爬取目标 您好!我是@马哥python说,一名10年程序猿. 最近的亚运会大家都看了吗.除 ...