Rust étoffe le catalogue de types Range

La version 1.96.0 de Rust stabilise un ensemble de types Range qui implémentent l’interface IntoIterator plutôt que Iterator, ce qui évite aux développeurs d’implémenter par erreur à la fois Iterator et Copy.

Désormais disponible, la version 1.96.0 de Rust apporte de nouveaux types Range* à ce langage de programmation réputé pour sa sécurité mémoire. En détaillant ces ajouts, l’équipe Rust a expliqué que de nombreux utilisateurs s’attendent à ce que Range et les types core::ops associés soient de type Copy, mais ce n’est pas le cas. Ils implémentent directement Iterator, de sorte que « c’est un piège que d’implémenter à la fois Iterator et Copy sur le même type ». La RFC3550 proposait des types de plage de remplacement implémentant IntoIterator plutôt que Iterator, ce qui signifie qu’ils peuvent également être de type Copy. La partie de cette RFC relative à la bibliothèque standard est dorénavant stable, introduisant les types core::range::Range, core::range::RangeFrom, core::range::RangeInclusive et les itérateurs associés.

Une future version de Rust ajoutera core::range::RangeFull et core::range::RangeTo en tant que réexportations depuis core::ops. « Ces types n’implémentent pas Iterator mais intègrent déjà Copy », a précisé l’équipe Rust. Une future version du langage introduira aussi core::range::legacy::* comme emplacement pour les plages actuelles. « Pour l’instant, la syntaxe de plage telle que 0..1 produit encore les types hérités », a spécifié l’équipe Rust, mais elle sera mise à jour vers les types core::range dans une prochaine édition. Grâce à ces stabilisations, il est désormais possible de stocker des accesseurs de tranche dans des types Copy sans séparer le début et la fin, selon l’équipe. De plus, le type RangeInclusive rend ses champs publics, contrairement à la version héritée qui évitait d’exposer l’état itérateur épuisé.

Deux macros supplémentaires

Par ailleurs, dans la version 1.96.0, deux macros, assert_matches! et debug_assert_matches!, vérifient qu’une valeur correspond à un motif donné, et déclenchent le mécanisme de panique avec une représentation Debug de la valeur dans le cas contraire. Par ailleurs, les cibles WebAssembly ne transmettent plus l’option –allow-undefined à l’éditeur de liens, ce qui signifie que les symboles non définis lors de la liaison génèrent désormais une erreur d’éditeur de liens au lieu d’être convertis en importations WebAssembly à partir du module « env ». Ce changement empêche la liaison des modules tant que tous les symboles liés à la liaison ne sont pas définis, afin de détecter les bogues plus tôt et d’éviter les problèmes accidentels liés à la dénomination des symboles ou autres.

À noter que le 30 juin, l’équipe Rust a publié une version mineure, Rust 1.96.1, qui apporte les corrections suivantes pour Cargo, MIR et libssh2 :

– Absence de tentatives de reconnexion/délais d’expiration dans le client HTTP de Cargo ;

– Erreur de compilation dans une optimisation MIR

– Correctifs pour CVE-2025-15661, CVE-2026-55199, et CVE-2026-55200.

Annoncée le 28 mai, la version Rust 1.96.0 peut être installée par les utilisateurs actuels en exécutant la commande rustup update stable.

chevron_left
chevron_right