关于语法:“ dyn”在类型中是什么意思?

What does “dyn” mean in a type?

我最近看过使用dyn关键字的代码:

1
2
3
fn foo(arg: &dyn Display) {}

fn bar() -> Box<dyn Display> {}

这个语法是什么意思?


TL; DR:这是用于指定特征对象类型的语法,出于清晰起见,应首选该语法。

从Rust 1.0开始,特质带来双重生活。声明了特征后,就可以将其用作特征或类型:

1
2
3
4
5
6
// As a trait
impl MyTrait for SomeType {}

// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}

可以想象,这种双重含义可能会引起一些混乱。另外,由于MyTrait类型是未调整大小/动态大小的类型,因此这可能使人们暴露于非常复杂的错误消息中。

为了改善此问题,RFC 2113引入了dyn语法。从Rust 1.27开始可以使用以下语法:

1
2
3
4
5
6
7
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语法相似,并努力使特征对象的类型与"裸露"特征语法更加明显不同。

在后续的Rust版本中,裸语法可能会被弃用,然后最终被删除。

  • 为什么我要在特征上实现方法而不是特征的一部分?
  • 是什么使某物成为"特质对象"?