89 votes

Que signifie "dyn" dans un type?

J'ai récemment vu du code utilisant le mot clé dyn :

 fn foo(arg: &dyn Display) {}

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

Que signifie cette syntaxe?

80voto

Shepmaster Points 1732

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


Depuis la Rouille 1.0, les traits ont mené une double vie. Une fois qu'un caractère a été déclaré, il peut être utilisé soit comme un trait de caractère ou de type:

// As a trait
impl MyTrait for SomeType {}

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

Comme vous pouvez l'imaginer, ce double sens que peut causer une certaine confusion. En outre, depuis l' MyTrait type est un sans apprêt / dynamiquement la taille du type, ce qui peut exposer les personnes à très complexe des messages d'erreur.

Pour atténuer ce problème, RFC 2113 introduit l' dyn de la syntaxe. Cette syntaxe est disponible à partir de Rouille 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é de parallels l' impl Trait de la syntaxe et s'efforce de faire le type d'un trait de l'objet plus évidemment distincte de la "nue" caractéristique de la syntaxe.

Il est probable que lors d'une prochaine édition de la Rouille, le nu de la syntaxe obsolète et puis finalement retiré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X