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 голый синтаксис будет устаревать, а затем удален.