前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust trait 定义简单到复杂

Rust trait 定义简单到复杂

原创
作者头像
8菠萝
修改2021-05-31 10:33:00
8700
修改2021-05-31 10:33:00
举报
文章被收录于专栏:菠萝上市没有

Trait 在Rust主要用于公共接口的定义,做为事物Behavior的抽象。

今天梳理下从最简单的trait到复杂的trait定义方式。

最简单的 trait

代码语言:javascript
复制
pub trait A {
    fn hello_a(&self);
}

struct People;
impl A for People{
    fn hello_a(&self) {
        println!("Hello A");
    }
}

带类型关联 trait

代码语言:javascript
复制
pub trait B  {
    type Item;
    fn hello_b(&self, item:Self::Item );
}

// 指定类型为String
impl B for People {
    type Item = String;
    fn hello_b(&self, item:Self::Item ) {
        println!("Hello B {}", item);
    }
}

类型关联与泛型接口很像,但使用类型关联,我们只需要实现想要的类型,后面使用就不像泛型接口,需要每次指定类型。

依赖其他trait的trait

代码语言:javascript
复制
// 接口 C 依赖 A 和 B
pub trait  C : A + B{
    fn hello_c(&self);
}

impl A for People{
    fn hello_a(&self) {
        println!("Hello A");
    }
}

impl B for People {
    type Item = String;
    fn hello_b(&self, item:Self::Item ) {
        println!("Hello B {}", item);
    }
}

// 如果A、B接口未对People实现,则编译出错
impl C for People {
    fn hello_c(&self) {
        println!("Hello C");
    }
}

对于依赖其他trait的trait,相当于对行为加了约束,比如如果飞机要fly, 必须有run,先跑起来才有起飞。

依赖类型和Trait的Trait

代码语言:javascript
复制
// D 及依赖 A、B, 同时B的关联类型必须实现A的接口
pub trait  D : A + B where <Self as B>::Item : A{
    fn hello_d(&self);
}

impl A for People{
    fn hello_a(&self) {
        println!("Hello A");
    }
}

impl B for People {
    type Item = String;
    fn hello_b(&self, item:Self::Item ) {
        println!("Hello B {}", item);
    }
}

impl D for People {
    fn hello_d(&self) {
        println!("Hello D");
    }
}

// 为关联类型实现A接口
impl A for String {
    fn hello_a(&self) {
    }
}

fn main(){
    let man = People;
    man.hello_d();
}

上面的接口D 依赖A和B接口,同时需要B的关联类型需要实现A接口。 目前四类接口基本已经覆盖大部分使用。

泛型接口类似,后面需要分析时再补充完整。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最简单的 trait
  • 带类型关联 trait
  • 依赖其他trait的trait
  • 依赖类型和Trait的Trait
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档