web-dev-qa-db-fra.com

Que signifie "dyn" dans un type?

J'ai récemment vu du code à l'aide du mot clé dyn:

fn foo(arg: &dyn Display) {}

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

Que signifie cette syntaxe?

38
Shepmaster

TL; DR: C'est la syntaxe pour spécifier le type d'un objet trait et devrait être préférée pour des raisons de clarté.


Depuis Rust 1.0, les traits ont mené une double vie. Une fois qu'un trait a été déclaré, il peut être utilisé soit comme trait soit comme type:

// As a trait
impl MyTrait for SomeType {}

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

Comme vous pouvez l'imaginer, cette double signification peut créer une certaine confusion. De plus, étant donné que le type MyTrait est un type non dimensionné/de taille dynamique, cela peut exposer les utilisateurs à des messages d'erreur très complexes.

Pour améliorer ce problème, RFC 211 a introduit la syntaxe dyn. Cette syntaxe est disponible à partir de 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);
}

Ce nouveau mot clé est parallèle à impl Trait syntaxe et s'efforce de rendre le type d'un objet de trait plus clairement distinct de la syntaxe de trait "nu".

Il est probable que dans une prochaine édition de Rust , la syntaxe nue sera obsolète puis finalement supprimée.

26
Shepmaster