Что означает "dyn" в типе?

Недавно я видел код с использованием ключевого слова dyn:

fn foo(arg: &dyn Display) {}

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

Что означает этот синтаксис?

Ответ 1

TL; DR: синтаксис для указания типа объекта-признака и должен быть предпочтительным для ясности.


Начиная с Rust 1.0, черты привели к двойной жизни. Как только признак объявлен, его можно использовать либо как признак, либо как тип:

// As a trait
impl MyTrait for SomeType {}

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

Как вы можете себе представить, этот двойной смысл может вызвать некоторую путаницу. Кроме того, поскольку тип MyTrait является типом нестандартного/динамического размера, это может привести людей к очень сложным сообщениям об ошибках.

Чтобы облегчить эту проблему, RFC 2113 представил синтаксис 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 синтаксисом синтаксиса impl Trait и стремится сделать тип объекта-признака более явно отличным от синтаксиса "голых" признаков.

Вероятно, в последующем выпуске Rust голый синтаксис будет устаревать, а затем удален.