美文网首页
为trait object和trait constraint实现

为trait object和trait constraint实现

作者: Loru_vest | 来源:发表于2020-08-11 16:10 被阅读0次

在Rust里,我们一般倾向于为一个具体的类型实现实现trait,然而,还有一种鲜为人知的写法,为泛型实现trait。分为trait object和带有trait constraint的泛型参数两种。

impl trait for trait object

定义traitX,Y和一个简单的结构体A

trait X {
    fn say_hello(&self);
}

trait Y {
    fn say_yes(&self);
}

struct A(String);

然后可以为trait X object实现traitY

impl Y for dyn X {
    fn say_yes(&self) {
        println!("Yes");
    }
}

要想使用这个say_yes方法,先为A实现traitX

impl X for A {
    fn say_hello(&self) {
        println!("Hello, {}", self.0);
    }
}

然后试试看

fn main() {
    let a: &dyn X = &A("TENX".to_string());
    a.say_yes();
}
$ cargo run                                                                                                                      
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/demo1`
Yes

impl trait for trait constraint

与上面一样,先定义两个traitA,B

trait A {
    fn say_hello();
}

trait B {
    type T;
    fn f() -> Self::T;
}

然后可以为一个带有constraint的泛型参数X实现traitA

impl<X> A for X
where X: B,
      X::T: std::fmt::Display,
{
    fn say_hello() {
        println!("hello, {}", X::f());
    }
}

要使用say_hello,我们先为一个具体的类型实现traitB,注意,associate type必须还满足constraint: std::fmt::Display

struct Foo;

impl B for Foo {
    type T = String;
    fn f() -> String {
        "TENX".to_string()
    }
}

测试一下

fn main() {
    Foo::say_hello();
}
> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.11s
     Running `target/debug/demo2`
hello, TENX

作用

作用的话?类似于patch?但是为什么不直接在原本的trait里做呢。

相关文章

  • 为trait object和trait constraint实现

    在Rust里,我们一般倾向于为一个具体的类型实现实现trait,然而,还有一种鲜为人知的写法,为泛型实现trait...

  • 7.9 Trait

    trait 是PHP为类只能单继承而实现的代码复用机制。 trait 不能继承,也不能实现接口。 trait 不能...

  • php中的trait机制提高代码复用

    什么是trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是...

  • 第十二章:Trait

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 PHP 的...

  • php Trait

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 PHP 的...

  • Rust impl trait

    trait特性 trait特性可以理解为Java中的接口,具备和接口很类似的特性。trait中的函数叫做方法。某个...

  • PHP实现多继承

    方法一 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 P...

  • rust-trait

    什么是trait,trait相对于java就是interface。 基本的trait例子 在trait中,由sel...

  • Spark Sql 源码剖析(二): TreeNode

    零、前置知识 Scala Product trait 一、CurrentOrigin 使用 object Curr...

  • 【C++】Geekband-专题四:trait 的使用

    [TOC] 1. 基本定义 Think of a trait as a small object whose ma...

网友评论

      本文标题:为trait object和trait constraint实现

      本文链接:https://www.haomeiwen.com/subject/rudydktx.html