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。DogCat结构体都实现了这个trait。函数animal_sound可以接受任何实现了Speak的类型。

如果一个 Rust 的 trait 定义了多个方法,当你为某个类型实现这个 trait 时,需要为这些方法提供具体实现。调用这些方法时,只需使用实现了该 trait 的类型的实例。

以下是一个扩展前面示例的例子,这次 Speak trait 包含两个方法:speakcan_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());
}

在这个例子中,DogBird 都实现了 Speak trait。每个实现都必须提供 speakcan_fly 方法的具体实现。在 main 函数中,我们创建了 DogBird 的实例,并分别调用了它们的 speakcan_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 有两个方法:speakis_loudis_loud 方法有一个默认实现,这意味着在为 Dog 类型实现 Speak trait 时,我们可以选择不为 is_loud 方法提供自己的实现,并使用默认实现。

rust 中的 impl 是什么?

在Rust中,impl是一个关键字,用于在类型上实现方法。它是将函数与特定类型(结构体或枚举)关联起来的一种方式。impl主要有两种用途:

  1. 实现方法:你可以为特定类型定义方法。然后可以在该类型的实例上调用这些方法。

    示例:

    rustCopy code
    struct Rectangle {
    width: u32,
    height: u32,
    } impl Rectangle {
    fn area(&self) -> u32 {
    self.width * self.height
    }
    }

    在这个示例中,为Rectangle结构体实现了一个名为area的方法,用于计算矩形的面积。

  2. 实现特质(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 相关的概念和疑问的更多相关文章

  1. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

    本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...

  2. linux设备驱动归纳总结(二):模块的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...

  3. linux设备驱动归纳总结(一)内核的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...

  4. 一、HTML概述 二、web相关的概念 三、HTML的常用标签

    一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...

  5. WiFi相关基础概念

    转自:https://blog.csdn.net/lbaihao/article/details/73250798 一.WiFi相关基础概念 1.什么是wifi 我们看一下百度百科是如何定义的: Wi ...

  6. (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结

    1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...

  7. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

    linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 与类相关基本概念----Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  10. 【转】与BT下载相关的概念

    1. DHT DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法.在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整 ...

随机推荐

  1. 如何评估Serverless服务能力,这份报告给出了40条标准

    简介: 如今,已经有评测机构给出了40条标准来对Serverless的服务能力进行评估,这些评估细则既是技术生态繁荣发展的一种表现,也可以作为新进入者评估Serverless落地成效的一种参考依据. ...

  2. django-rest-framework框架(一)

    1.Web开发模式 # web开发模式 #前后端混合开发(前后端不分离):返回的是html的内容,需要写模板 #前后端分离:只专注于写后端接口,返回json,xml格式数据 # xml格式 <x ...

  3. HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?

    UIAbility 生命周期: onCreate :页面初始化,变量定义,资源加载. onWindowStageCreate:设置 UI 界面加载.设置 WindowStage 的事件订阅. onFo ...

  4. 使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV

    前言 吐槽:由于科研任务,需要在云端运行一个基于神经网络的目标识别库,需要用到GPU加速.亚马逊有很多自带GPU的机器,但是环境的配置可折腾坏了,尤其是opencv,每次总会出各种各样的问题! 无奈中 ...

  5. 利用神经网络对脑电图(EEG)降噪------开源的、低成本、低功耗微处理器神经网络模型解决方案

    具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 这个示例展示了如何使用EEGdenoiseNet基准数据集[1]和深度学习回归去除脑电图(EEG ...

  6. .NET有哪些好用的定时任务调度框架

    前言 定时任务调度的相关业务在日常工作开发中是一个十分常见的需求,经常有小伙伴们在技术群提问:有什么好用的定时任务调度框架推荐的?今天大姚给大家分享5个.NET开源.简单.易用.免费的任务调度框架,帮 ...

  7. WebKit Inside: CSS 样式表的解析

    CSS 全称为层叠样式表(Cascading Style Sheet),用来定义 HTML 文件最终显示的外观. 为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Sele ...

  8. SQLServer统计监控SQL执行计划突变的方法

    使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图.以下是一些可以用于此目的的DMVs以及相应的查询示例: sys.dm_exec_query_ ...

  9. C语言:判断是否为素数,并且打印素数表

    /*     构造素数表, 只需要用数字除以已经判断出来的数是否能整除就行,     不需要除以这个数之前所有的数字,     前提是这个数除以的素数是要比他自己小的      */ 注意一点:int ...

  10. 国产系统UOS安装体验

    原文链接 https://www.giantliu.cn/2020/09/04/200904InstallUOS/ UOS简介 统信桌面操作系统(Uniontech OS)个人正式版是统信软件基于Li ...