TL;DR:这是一种用于指定 a 类型的语法特质对象并且为了清晰起见必须指定。
自 Rust 1.0 以来,trait 就开始了双重生活。一旦声明了特征,它就可以用作特征或类型:
// As a trait
impl MyTrait for SomeType {}
// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}
正如您可以想象的那样,这种双重含义可能会引起一些混乱。此外,由于MyTrait
type 是一种未调整大小/动态调整大小的类型,这可能会让人们看到非常复杂的错误消息。
为了改善这个问题,RFC 2113 https://github.com/rust-lang/rfcs/blob/master/text/2113-dyn-trait-syntax.md介绍了dyn
句法。此语法从 Rust 1.27 开始可用:
use std::{fmt::Display, sync::Arc};
fn main() {
let display_ref: &dyn Display = &42;
let display_box: Box<dyn Display> = Box::new(42);
let display_arc: Arc<dyn Display> = Arc::new(42);
}
这个新关键字与impl Trait
语法并努力使 a 的类型特质对象 https://stackoverflow.com/q/27567849/155423与“裸”特征语法更明显不同。
dyn
是“动态”的缩写,指的是特征对象执行的事实动态调度 https://en.wikipedia.org/wiki/Dynamic_dispatch。这意味着确切调用哪个函数的决定将在程序运行时发生。将此对比静态调度 https://en.wikipedia.org/wiki/Static_dispatch它使用impl Trait
syntax.
语法不带dyn
现已弃用并且已在 2021 版中删除 https://doc.rust-lang.org/edition-guide/rust-2021/warnings-promoted-to-error.html#bare_trait_objects.
- 为什么我要在特征上实现方法而不是作为特征的一部分? https://stackoverflow.com/q/34438755/155423
- 是什么让某物成为“特质对象”? https://stackoverflow.com/q/27567849/155423