Parmi les nouvelles fonctionnalités annoncées par l’équipe, Rust 1.19.0 est la première version qui supporte union :
Code Rust : | Sélectionner tout |
1 2 3 4 | union MyUnion { f1: u32, f2: f32, } |
Les union sont comme enum, mais ils sont « non étiquetés ». Les enum disposent d’étiquette qui stocke la variante appropriée à l'exécution; Les union élident cette étiquette.
Puisque nous pouvons interpréter les données détenues dans l'union en utilisant la mauvaise variante et que Rust ne peut pas vérifier cela pour nous, cela signifie que la lecture ou l'écriture d'un champ d'union n'est pas sécurisée :
Code Rust : | Sélectionner tout |
1 2 3 4 5 | let u = MyUnion { f1: 1 }; unsafe { u.f1 = 5 }; let value = unsafe { u.f1 }; |
Le pattern matching fonctionne également:
Code Rust : | Sélectionner tout |
1 2 3 4 5 6 7 8 | fn f(u: MyUnion) { unsafe { match u { MyUnion { f1: 10 } => { println!("ten"); } MyUnion { f2 } => { println!("{}", f2); } } } } |
Quand est-ce que les union peuvent s’avérer utiles ? Un cas d'utilisation majeur est l'interopérabilité avec C. Les API de C peuvent exposer les unions, ce qui facilite l’écriture des API qui vont intégrer ces bibliothèques.
Cette fonctionnalité a longtemps été attendue et, bien entendu, des améliorations sont prévues. Pour le moment, les union n’intègrent que les types copy et ne pourraient ne pas encore implémenter drop. « Nous prévoyons de lever ces restrictions à l'avenir », a assuré l’équipe.
Il est désormais possible de sortir (break) des boucles loop avec une valeur :
Code Rust : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | // ancien code let x; loop { x = 7; break; } // nouveau code let x = loop { break 7; }; |
Parmi les fonctionnalités mineures, l’équipe note par exemple qu’il est possible de produire des tarballs compressés xz et qu’elle les préfère par défaut, ce qui rend le transfert de données plus petit et plus rapide. Les tarballs Gzip sont encore produits dans le cas où vous ne pouvez pas utiliser xz pour une raison quelconque.
Le compilateur peut maintenant démarrer sur Android. « Nous avons supporté depuis longtemps Android de différentes façons, ce qui continue d'améliorer notre support », a commenté l’équipe.
Côté compatibilité, l’équipe indique que « Lorsque nous allions vers Rust 1.0, nous avons fait une énorme pression pour vérifier tout ce qui était marqué comme stable et aussi instable. Nous avons négligé une chose, cependant : les drapeaux -Z. Le drapeau -Z permet au compilateur d’utiliser des drapeaux instables. Contrairement au reste de notre histoire de stabilité, vous pouvez toujours utiliser -Z sur une version stable de Rust. En avril 2016, dans Rust 1.8, nous avons émis un avertissement lors de l’usage de -Z sur la version stable ou bêta. Plus d'un an plus tard, nous résolvons ce trou dans notre histoire de stabilité en refusant -Z sur les versions stable et bêta. »
Stabilisations au niveau de la bibliothèque
La plus grande fonctionnalité de la nouvelle bibliothèque est l’ajout des macros eprint! et eprintln!. Elles fonctionnent exactement comme print! et println!, mais écrivent plutôt sur une erreur standard, par opposition à la sortie standard.
Autres nouvelles fonctionnalités :
- String implémente désormais FromIterator<Cow<'a, str>> et Extend<Cow<'a, str>> ;
- Vec implémente désormais From<&mut [T]> ;
- Box <[u8]> implémente désormais From<Box<str>> ;
- SplitWhitespace implémente désormais Clone.
Rust s'est traditionnellement positionné comme un « langage orienté vers l'expression », c'est-à-dire que la plupart des choses sont des expressions qui évaluent une valeur plutôt que des déclarations qui évaluent une valeur.
Source : annonce de Rust 1.19
Et vous ?
Utilisez-vous Rust ? Pour quel type de développement ? Qu'en pensez-vous ?
Quelle est la nouveauté qui vous a le plus intéressé ?