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?
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?
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 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.