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