Trait

trait items #

  • Self
  • Functions
  • Methods
  • Associated Types
  • Generic Parameters
    • Generic type parameters
    • Generic lifetime parameters
    • Generic contant parameters

Scope #

Struct 实现了 trait,但是也需要 use 相关的 trait 才能使用。

Derive Macros #

也是 procedural macro, 标准库提供的方便地实现一部分常用 trait 的方式。

需要所有的成员都实现了这个 trait 。

Default Implementation #

定义 trait 时候也给出默认的实现。

impl trait #

static dispatch

trait objects #

#[test]
fn test_return_impl_trait() {
    trait Animal {
        fn name(&self) -> String { "animal".to_owned() }
    }

    struct Sheep {}
    impl Animal for Sheep {
        fn name(&self) -> String { "sheep".to_owned() }
    }

    struct Dog {}
    impl Animal for Dog {
        fn name(&self) -> String { "dog".to_owned() }
    }

    // THIS WON'T WORK
    // fn running_animal() -> impl Run {
    //     let random = true;
    //     if random {
    //         Dog {}
    //     } else {
    //         Sheep {} // compile-time error, as `impl Trait` is static
    //     }
    // }

    fn dynamic_animal(random: bool) -> Box<dyn Animal> {
        if random {
            Box::new(Dog {})
        } else {
            Box::new(Sheep {})
        }
    }

    assert_eq!(&dynamic_animal(true).as_ref().name(), "dog");
    assert_eq!(&dynamic_animal(false).as_ref().name(), "sheep");
}
  • base trait, lifetime bounds, supertraits
  • trait safety

dyn 是 2021 Edition 引入的语法 dyn-trait-syntax。如下转换 rust-2018-new-keywords

  • Box<Trait> => Box<dyn Trait>
  • &Trait => &dyn Trait
  • &mut Trait => &mut dyn Trait

dyn trait example

Blanket Implementation #

Subtrats & Supertraits #

Trait Objects #

Marker Traints #

Auto Traits #

Unsafe Traits #

async trait #

https://github.com/dtolnay/async-trait