ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Rust Trait

2021-12-01 14:32:13  阅读:170  来源: 互联网

标签:Trait pub Summary Rust trait fn notify


Trait

Trait告诉rust编译器某种类型具有哪些并且可以与其他类型共享的功能。抽象的定义共享行为。

有点类似继承。

定义一个Trait

trait Summary {
    // 只创建方法,声明签名
    fn summarize(&self) -> String;
}

在类型实现trait

impl Xxxx for Tweet {...}
Tweet是类型名,这里是个结构体。

当一个类型定义了trait之后,可以直接使用这个trait方法。

比如Tweet struct实现了Summary这个trait,并且trait里有个summarize方法。main函数中又实例化了一个article的Tweet struct,那么可以直接使用article.summarize()

来自trait里的东西在作用域里才能使用。

在trait里也可以做默认实现

默认实现的方法可以调用trait中其他的方法,即使这些方法没有默认实现。但是在具体事例上使用这个默认方法,就必须先把其他方法实现了。

Trait bounds

要求泛型类型的参数实现了某些Trait。

前提条件:这个类型或trait是在本地crate里定义的。(不准重写源码,孤儿规则)

Trait 作为参数

pub fn notify(itemi: impl Summary, itemk: impl Summary){}
要求传入的item必须实现了Summary的trait,这样就可以实现itemi.Summary里的方法

pub fn notify<T: Summary>(item: T){}
使用trait bound写法。

要求同时实现两个trait

use std::fmt::Display;
pub fn notify(itemi: impl Summary + Display){}

pub fn notify<T: Summary + Display>(item: T){}

where指定trait约束

冗余的写法
pub fn notify<T: Summary + Display, U: Clone + Debug>(a: T, b: U) -> String {a.summarize()}

where写法

pub fn notify<T, U>(a: T, b: U) -> String
where
  T: Summary + Display,
  U: Clone + Debug,
{a.summarize()}

返回类型要求实现某个trait

pub fn notify(s: &str) -> impl Summary{}

如果这么要求,那么这个函数或方法必须只能返回一种可能性结果(同一种类型)。

总结

  1. trait类似继承重写,可以把它理解为一个抽象公共模板接口。调用时就是用这个模板去实现内部的方法,但是这个方法在每个结构体里可以是不一样的。
trait 类{}

// impl 父类 for 类
// class 结构体(类)
impl 类 for 结构体
  1. 导入本地Trait的时候要在Cargo.toml修改[package]中的name字段。
    eg: 假设name为demo,导入时:
    use demo::Summary;

标签:Trait,pub,Summary,Rust,trait,fn,notify
来源: https://www.cnblogs.com/hatsuzuki/p/15628820.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有