Rust 1.95.0 : Comment les nouvelles fonctionnalités simplifient le développement en Rust
La version stable de Rust 1.95.0 a été publiée, élargissant les capacités du langage pour créer du code sûr et efficace. Les principaux changements se concentrent sur la simplification de la compilation conditionnelle, l'amélioration de la syntaxe d'appariement de motifs, et la stabilisation d'API critiques. Ces mises à jour impactent directement le travail quotidien des développeurs en réduisant la charge cognitive et en minimisant le code boilerplate.
La macro cfg_select! : Une alternative intégrée à cfg-if
La nouvelle macro cfg_select! résout le problème des implémentations dépendantes de la plateforme qui nécessitaient auparavant la crate externe cfg-if. Désormais, la compilation conditionnelle au moment de la construction est intégrée à la bibliothèque standard. La macro fonctionne comme match pour les directives cfg, en sélectionnant la première branche dont le prédicat est vrai. Cela est particulièrement utile pour implémenter des bibliothèques multiplateformes, où du code différent est nécessaire pour Unix, Windows ou des architectures spécifiques.
Exemple d'utilisation :
cfg_select! {
unix => {
fn platform_specific() { /* Sale for Unix */ }
}
target_pointer_width = "32" => {
fn platform_specific() { /* 32-bitnaya realizatsiya */ }
}
_ => {
fn platform_specific() { /* Defolt */ }
}
}
Avantage clé : aucune dépendance à des crates externes et syntaxe unifiée avec les autres macros Rust. Note : la macro se développe en une seule branche au moment de la compilation, de sorte que les parties de code inutilisées sont complètement exclues du binaire.
Les gardes if-let dans les expressions match : Élargissement des capacités d'appariement de motifs
Rust 1.95.0 stabilise les gardes if-let à l'intérieur des expressions match, permettant de combiner appariement de motifs et vérifications conditionnelles dans une seule branche. Cette fonctionnalité, précédemment disponible uniquement dans les versions nightly, est désormais sur le canal stable. La syntaxe reste concise et lisible, évitant les expressions match imbriquées.
Exemple :
match data {
Some(x) if let Ok(y) = process(x) => {
// Dostupny x and y
handle(x, y);
}
_ => fallback(),
}
Limitation importante : le compilateur ne prend pas en compte les motifs dans les gardes if-let lors de la vérification d'exhaustivité. Cela signifie qu'une branche avec une garde if-let ne garantit pas la gestion de tous les cas possibles, contrairement à un match standard. Les développeurs doivent vérifier explicitement la couverture des scénarios.
API stabilisées : Principaux changements
La sortie stabilise plus de 30 API affectant les opérations de bas niveau et la gestion de la mémoire. Principaux groupes de changements :
- Gestion de la mémoire non initialisée : Méthodes
From,AsRef,AsMutpourMaybeUninit<[T; N]>simplifient le travail avec des buffers bruts. - Opérations atomiques : Ajout de
updateettry_updatepourAtomicPtr,AtomicBool,AtomicInt,AtomicUint. - Opérations sur les collections : Nouvelles méthodes
push_mut,insert_mutpourVec,VecDeque,LinkedList. - Utilitaires de bas niveau :
Layout::dangling_ptr,Layout::repeat,cold_path.
D'intérêt particulier est la stabilisation de bool: TryFrom<{integer}>, qui permet de convertir en toute sécurité les types entiers en booléens via TryFrom. Cela élimine le besoin de vérifications manuelles comme value != 0.
Déprécation des cibles personnalisées : Qu'est-ce qui change
Rust 1.95.0 supprime le support des spécifications de cibles JSON personnalisées dans le canal stable. Cette fonctionnalité, précédemment disponible via l'option --target, nécessitait des outils nightly même pour des constructions basiques de la bibliothèque standard. Désormais, les utilisateurs avec une chaîne d'outils entièrement stable ne rencontreront pas d'erreurs inattendues mais perdront la capacité de personnaliser les cibles.
L'équipe Rust recueille les cas d'utilisation dans l'issue de suivi pour déterminer comment stabiliser cette fonctionnalité à l'avenir. Pour l'instant, passez aux cibles officielles ou utilisez le canal nightly pour les expériences.
Points clés à retenir
- La macro
cfg_select!remplacecfg-ifdans la bibliothèque standard, éliminant les dépendances externes. - Les gardes if-let dans les expressions match simplifient les vérifications complexes mais n'affectent pas la vérification d'exhaustivité.
- La stabilisation des opérations atomiques et des méthodes de mémoire est cruciale pour la programmation système.
- La suppression des cibles personnalisées dans le canal stable nécessite une révision des constructions personnalisées.
La mise à jour vers Rust 1.95.0 est recommandée pour tous les projets où le support des API modernes et la simplification de la compilation conditionnelle comptent. Pour tester les sorties futures, utilisez le canal beta (rustup default beta).
— Editorial Team
Aucun commentaire pour le moment.