Code Rust : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | fn read_username_from_file() -> Result<String, io::Error> { let f = File::open("username.txt"); let mut f = match f { Ok(file) => file, Err(e) => return Err(e), }; let mut s = String::new(); match f.read_to_string(&mut s) { Ok(_) => Ok(s), Err(e) => Err(e), } } |
Un bloc de code sans le nouvel opérateur ?
Dans le bloc de code ci-dessus, on a deux erreurs qui peuvent se produire. En lisant le fichier et en ouvrant ce dernier. Pour retourner une erreur à partir de la fonction read_username_from_file, il faut utiliser le mot clé match pour associer les différentes opérations aux résultats. Bien que le résultat puisse paraître satisfaisant pour certains, l’équipe de Rust montre qu’avec le nouvel opérateur ?, le code s’avère plus concis.Code Rust : | Sélectionner tout |
1 2 3 4 5 6 | fn read_username_from_file() -> Result<String, io::Error> { let mut f = File::open("username.txt")?; let mut s = String::new(); f.read_to_string(&mut s)?; Ok(s) } |
Un bloc de code avec le nouvel opérateur ?
Comme on le constate ci-dessus, avec le nouvel opérateur, on n’a plus besoin de faire correspondre les différentes opérations aux résultats en utilisant le mot clé match qui peut être perçu comme Switch qui est utilisé dans le langage C. En mettant ? devant les différents cas, l’opérateur retourne la valeur du résultat si c’est OK ou sinon retourne une erreur.Pour certains développeurs, ce nouvel opérateur pourrait ne rien apporter de nouveau, car il n'est en rien différent de la macro try!. Face à ces arguments, l’équipe de Rust rétorque dans certains cas, le code avec ? s’avère plus élégant expose moins à des erreurs qu’en utilisant try!. Par exemple, des deux blocs de code ci-dessous, celui avec l’opérateur ? est plus facile à lire que le code avec try!.
Code Rust : | Sélectionner tout |
1 2 3 | foo()?.bar()?.baz()? // Code avec ? plus lisible try!(try!(try!(foo()).bar()).baz()) // Code avec try! Moins lisible |
À côté de l’apparition de ce nouvel opérateur, nous avons des optimisations au niveau du compilateur. Par exemple, pendant la génération du code LLVM IR, le compilateur ne retraite plus les instances des types associés à chaque fois qu’elles sont demandées, mais réutilise les valeurs précédemment calculées. En outre, nous avons une autre optimisation qui affecte positivement les performances du temps de compilation. Cette optimisation se situe au niveau des crates qui exportent plusieurs fonctions qui sont dotées du mot clé inline. Nous rappelons qu’un crate est une unité de compilation en Rust. Il s’apparente aux bibliothèques ou aux packages dans les autres langages.
Aussi, lorsqu’une fonction est #[inline], le compilateur stocke sa représentation MIR (mid-level IR) dans le crate rlib, qui est une bibliothèque statique régulière contenant des métadonnées supplémentaires. Ensuite, il traduit la fonction en code LLVM IR dans chaque crate qui l'appelle. Cette implémentation permet de soulager le compilateur de convertir les fonctions avec le paramètre inline en code LLVM IR pour ensuite le convertir en langage machine.
En plus de ces éléments, il faut noter dans la nouvelle mouture de Rust, des mises à jour de sécurité pour Cargo qui s’appuie sur Curl et OpenSSL. Ces deux outils ont été mis à jour par leurs auteurs et l’équipe de Rust a rendu ces nouvelles mises à jour compatibles avec cette version de Rust.
En dehors des éléments cités, nous avons plusieurs stabilisations au niveau du langage et des bibliothèques ainsi que l’ajout de fonctionnalités à Cargo, le gestionnaire de packages Rust.
Source : Rust
Et vous ?
Utilisez-vous Rust ? Que pensez-vous de cette nouvelle version ?
Voir aussi
Forum Rust