RUST 每日一省:trait种类

news/2024/7/24 11:19:03 标签: rust, 开发语言, 后端

       trait的基本形式,很简单,但这只是trait的冰山一角。当你开始接触大型代码库中的trait时,将会遇到它的多种形式。种类繁多有助于我们完成复杂问题的建模。下面我们一次介绍其他形式的trait,以便了解何时需要使用它们。

标准trait 


这是trait定义的最简单形式。我们它作为trait定义进行了阐述:

rust">trait Foo {
    fn foo();
}

标准库中的一个示例是 Default 特征,它主要是针对可以使用默认值初始化的类型实现的。

泛型trait


trait也可以是泛型。当用户希望为多种类型实现trait的情况下非常有用:

rust">pub trait From<T> {
    fn from(T) -> Self;
}

这样的例子是 From<T>,它们允许从某种类型转换为类型 T,反之亦然。例如下例,我们给Number实现了From<i32> trait,这意味着,所有的i32,都可以通过Number::from()函数转化为Number。

rust">#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

关联类型trait

rust">trait Contains<A, B> {
    fn contains(&self, _: &A, _: &B) -> bool; 
    fn first(&self) -> i32; 
    fn last(&self) -> i32; 
}

//关联类型
trait Contains {
    type A;
    type B;

    fn contains(&self, _: &Self::A, _: &Self::B) -> bool;
}

        这是泛型trait的更好选择,因为它们能够在trait中声明相关类型。它们具有较少的类型签名,其优点在于,在实际的编程中,它们允许用户一次性声明关联类型,并在任何特征方法或函数中使用 Self::A 作为返回类型或参数类型。这消除了类型的冗余声明,与泛型trait的情况类似。关联类型trait的最佳用例之一是 Iterator 特征, 它用于迭代自定义类型的值。 在后边文章, 我们将会深入介探讨一下。

marker  trait


        在 std::marker 模块中定义的特征被称为marker  trait。这种trait不包含任何方法,声明时只是提供特征名称和空的函数体。其实我们之前介绍copy和clone时,就介绍了copy其实就是 marker trait。
        除了Copy,标准库中的示例还有Send、 Sync。它们被称为marker  trait,因为它们用于简单地将类型标记为属于特定的组群,以获得一定程度的编译期保障。标准库中的两个这样的示例是 Send 和 Sync 特征,它们在适当的时候由语言为大多数类型自动实现,并确定哪些值可以安全地发送和跨线程共享。我们将在后续文章对它们进行详细介绍。

父trait


Rust 没有“继承”,但是你可以将一个 trait 定义为另一个 trait 的超集(即父 trait)。例如:

rust">trait Person {
    fn name(&self) -> String;
}

// Person 是 Student 的父 trait。
// 实现 Student 需要你也 impl 了 Person。
trait Student: Person {
    fn university(&self) -> String;
}

        在上述代码片段中,我们声明了一个trait Student,它依赖于父级trait Person。在 Student的定义中,要求用户在为类型实现 Student特征时必须为 Person trait提供实现。标准库中的这样一个示例是 Copy trait,它要求类型必须实现 Clone trait。

派生trait

通过 #[derive] ,编译器能够提供某些 trait 的基本实现。如果需要更复杂的行为,这些 trait 也可以手动实现。

下面是标准库中一些可以自动派生的 trait:

  • 比较 trait: Eq,PartialEq,Ord,PartialOrd 
  • Clone, 用来从 &T 创建副本 T
  • Copy,使类型具有 “复制语义”(copy semantics)而非 “移动语义”(move semantics)。
  • Hash,从 &T 计算哈希值(hash)。
  • Default, 创建数据类型的一个空实例。
  • Debug,使用 {:?} formatter 来格式化一个值。


http://www.niftyadmin.cn/n/286779.html

相关文章

2022年终总结(5月补起)

总结 现在是2023年5月&#xff0c;回过头来看&#xff0c;抽点时间总结一下2022&#xff0c;2022年对自己是非常有挑战的一年&#xff0c; 整体转变呈现螺旋上升&#xff0c;组内交付接口 转身 subpm&#xff0c;subpm转身为PL。基本上每隔半年就会有新的挑战事物。 工作目标…

文献集锦 | 非因空间多组学技术在胰腺癌肿瘤微环境中的研究策略

胰腺导管腺癌(PDAC)仍然是一种难治性疾病&#xff0c;5年总生存率&#xff08;OS&#xff09;仅不到9%&#xff0c;且诊断时多为晚期&#xff0c;治疗手段有限&#xff0c;除了传统的手术切除、放化疗之外&#xff0c;目前越来越多采用新辅助治疗的方法。利用空间组学分析平台深…

C++11多线程编程——死锁问题

一、死锁现象 看到“死锁”二字&#xff0c;你是不是慌得不知所措。死锁&#xff0c;顾名思义就是这个锁死掉了&#xff0c;再也动不了了。那死锁是怎么产生的呢&#xff1f;当你对某个资源上锁后&#xff0c;却迟迟没有释放或者根本就无法释放&#xff0c;导致别的线程无法获…

白岩松《新闻观察》: 50岁的IT人— 鲁迅、冰心、王朔、刘震云怎么看?

您好&#xff01;观众朋友&#xff0c;我是白岩松&#xff0c;欢迎观看正在直播的“新闻观察"。今天的节目有文学名家鲁迅、冰心、王朔、刘震云参与&#xff0c;套用一句网络流行语 — 前方高能。 2023年4月&#xff0c;据国内新闻媒体报导&#xff0c;就业形势稳中有升。…

HTTP的特点

灵活可扩展 HTTP 协议最初诞生的时候就比较简单&#xff0c;本着开放的精神只规定了报文的基本格式&#xff0c;比如用空格分隔单词&#xff0c;用换行分隔字段&#xff0c;“headerbody”等&#xff0c;报文里的各个组成部分都没有做严格的语法语义限制&#xff0c;可以由开发…

AWS Lambda - 第二部分

Hello大家好&#xff0c;我们今天继续讨论AWS Lambda的内容。 Lambda的网络 首先&#xff0c;我们来讨论一下Lambda的网络&#xff0c;联网相关的内容。 在部署Lambda时&#xff0c;在默认情况下&#xff0c;Lambda函数是部署和运行在AWS的一个安全的VPC中&#xff0c;是在您…

Java面试题总结 | Java面试题总结11- Spring模块(持续更新)

Spring 文章目录 Spring什么是SpringSpringMVC、Spring、SrpingBoot的区别SSM和SpringBoot的区别IOC容器Spring Boot Starter有什么用SpringBoot启动原理说说你对AOP的理解spring用到的设计模式Spring是怎么解决循环依赖的&#xff1f;说说你对MVC的理解spring mvc执行流程什么…

PAT A1028 List Sorting

1028 List Sorting 分数 25 作者 CHEN, Yue 单位 浙江大学 Excel can sort records according to any column. Now you are supposed to imitate this function. Input Specification: Each input file contains one test case. For each case, the first line contains …