Что значит "дин" в типе? - PullRequest
0 голосов
/ 01 июня 2018

Я недавно видел код, использующий ключевое слово dyn:

fn foo(arg: &dyn Display) {}

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

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

1 Ответ

0 голосов
/ 01 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...