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. 应用容灾中,MySQL数据表是否需要跨云同步?

    简介: 容灾系统的重要目标在于保证系统数据和服务的"连续性".当系统发生故障时,容灾系统能够快速恢复服务和保证数据的有效性.为了防止天灾人祸.不可抗力,在同城或异地建立对应的IT系 ...

  2. 使用ssh连接远程仓库的方法(github)

    使用ssh连接远程仓库的方法 但是当我登录虚拟机想提交csapp的代码时,我发现需要验证我的账号密码,感觉每次提交都要输入这个很麻烦.然后就在网上查询了下为何提交代码需要输入账号密码. 使用 HTTP ...

  3. [Java]线程生命周期与线程通信

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18162522 出自[进步*于辰的博客] 线程生命周期与 ...

  4. 通俗易懂的生产环境Web应用架构介绍

    前言 看见一篇非常通俗易懂且适合新手阅读的Web应用架构文章,我将其手工翻译了出来,分享给大家. 也可以去阅读英文原文,标题为,贴出链接: https://stephenmann.io/post/wh ...

  5. 如何禁用IntelliJ IDEA的LightEdit模式

    更新pycharm之后发现有了个新功能,默认打开文件的时候会单独打开一个窗口,以文本编辑的模式打开,而不是用项目模式.这种打开方式被称为LightEdit Mode.效果如下, 可以注意到窗口很简洁, ...

  6. 《Effective C++》第三版-4. 设计与声明(Design and Declarations)

    目录 条款17:让接口容易被正确使用,不易被误用(Make interfaces easy to use correctly and hard to use incorrectly) 限制类型和值 规 ...

  7. Oracle细粒度审计策略

    场景:经常需要查看某些表做了哪些操作. Oracle中,可以添加细粒度策略来获取,如下: begin dbms_fga.add_policy(object_schema => 'portxx', ...

  8. 8、shell 脚本

    1.shell 脚本基础 作用:介于系统内核与用户之间,负责解释命令行 1.1.第一个 shell 脚本 vim first.sh cd /boot/ pwd ls -lh vml*z 赋予可执行权限 ...

  9. 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口

    在近十年的发展,显示设备的接口发生了巨大的改变.以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接.后来,又有了HDMI等接口,现在则出现DP和USB ...

  10. 【题解】[NOIP2001 普及组] 装箱问题

    [NOIP2001 普及组] 装箱问题 这是一道动态规划题. 那就先定义状态吧(这里用的是一维滚动数组). \(f[j]\) 代表当我有 \(j\) 这么多容量可以用时,能装的最大重量是多少. 好,状 ...