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
и стремится сделать тип объекта trait более явно отличным от "голого""синтаксис черты.
Вполне вероятно, что в следующем выпуске Rust голый синтаксис будет признан устаревшим, а затем в конечном итоге удален.