dyn |
Dynamique |
|---|---|
| Rust | |
Syntaxe
| &dyn Trait |
| Box<dyn Trait> |
| Arc<dyn Trait> |
Paramètres
| Nom | Description |
|---|---|
| &dyn Trait | Ce paramètre permet de représenter une référence vers un objet trait dont le type exact est résolu dynamiquement à l'exécution (trait object). |
| Box<dyn Trait> | Ce paramètre permet de représenter un pointeur intelligent Box vers un objet trait, permettant un stockage dynamique et une gestion de propriété. |
| Arc<dyn Trait> | Ce paramètre permet de représenter un pointeur atomique de comptage partagé vers un objet trait, utile pour le partage thread-safe d'un trait object. |
Description
Ce mot réservé permet d'effectuer un envoi dynamique vers un objet de trait.
Remarques
dyn est un préfixe du type d'un objet trait.
Le mot clef dyn permet de souligner que les appels aux méthodes du trait associé sont distribués dynamiquement. Pour utiliser le trait de cette manière, il doit être compatible dyn1.
Contrairement aux paramètres génériques ou au trait impl, le compilateur ne connaît pas le type concret transmis. Autrement dit, le type a été effacé. Ainsi, une référence à un trait dyn contient deux pointeurs. L'un pointe vers les données (par exemple, une instance d'une structure). L'autre pointe vers une table de méthodes virtuelles (ou vtable) reliant les noms d'appels de méthodes aux pointeurs de fonctions.
À l'exécution, lorsqu'une méthode doit être appelée sur le trait dyn, la vtable est consultée pour obtenir le pointeur de fonction, puis ce pointeur est appelé.
Compromis
L'indirection ci-dessus représente le coût d'exécution supplémentaire lié à l'appel d'une fonction sur un trait dyn. Les méthodes appelées par répartition dynamique ne peuvent généralement pas être intégrées en ligne par le compilateur.
Cependant, le trait dyn est susceptible de produire du code plus léger que le trait impl ou les paramètres génériques, car la méthode ne sera pas dupliquée pour chaque type concret.