Rust 1.36.0 est disponible en version stable et apporte le type MaybeUninit <T>,
ainsi qu'une nouvelle implémentation de HashMap <K, V>

L’équipe responsable de Rust a annoncé la disponibilité de la nouvelle version Rust 1.36.0. Cette version apporte de nombreux changements, notamment la stabilisation du trait Future, le crate alloc, le type MaybeUninit <T>, NLL pour Rust 2015, une nouvelle implémentation de HashMap <K, V> et le support de -- offline dans Cargo. Pour rappel, Cargo est le gestionnaire de paquets de Rust. Il se base sur crates.io et rustc afin de compiler les programmes rust pour Windows, Mac OS, Linux, WASM ainsi que les publier sur crates.io (Le registre des paquets Rust). Il est programmé en Rust et s'utilise en ligne de commande.

Future

Dans Rust 1.36.0, le trait tant attendu Futura été stabilisé!

Avec cette stabilisation, l'équipe espère donner aux crate importants, aux bibliothèques et à l'écosystème le temps de se préparer à async / .await.

Le crate alloc est stable

L’unité de compilation en Rust est le crate (caisse en anglais) contrairement au C par exemple, où c’est le fichier. Chacun des crates d’un projet peut utiliser une édition différente du langage. On peut, par exemple, créer un nouveau crate 2015 et utiliser un crate 2018, qui utilise de nouveaux mots-clés sans problèmes. Le langage peut donc avoir des changements incompatibles sans que le code des utilisateurs n’en soit impacté.

Avant la version 1.36.0, la bibliothèque standard était composée des crate std, core et proc_macro. Le crate core fournissait des fonctionnalités essentielles telles que Iterator et Copy et pouvait être utilisée dans les environnements #! [No_std], car il n’imposait aucune exigence. Pendant ce temps, std crate fournissait des types tels que Box <T> et une fonctionnalité de système d'exploitation, mais nécessitait un allocateur global et d'autres fonctionnalités du système d'exploitation en retour.

À partir de Rust 1.36.0, les parties de std qui dépendent d’un allocateur global, par exemple. Vec <T>, sont maintenant disponibles dans le crate alloc. Le crate std ré-exporte ensuite ces parties. Bien que les binaires #! [No_std] utilisant alloc exigent toujours la nightly Rust, les crate de la bibliothèque #! [No_std] peuvent utiliser le crate alloc dans la version stable de Rust. Pendant ce temps, les fichiers binaires normaux, c'est à dire sans #! [No_std], peuvent dépendre de telles crate de bibliothèque. L'équipe espère que cela facilitera le développement d'un écosystème de bibliothèques compatible #! [No_std] avant de stabiliser la prise en charge des fichiers binaires #! [No_std] à l'aide d'alloc.

Si vous êtes le responsable d'une bibliothèque qui ne s'appuie que sur certaines primitives d'allocation, pensez à rendre votre bibliothèque # [no_std] compatible en utilisant ce qui suit en haut de votre fichier lib.rs:

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
#![no_std]
 
extern crate alloc;
 
use alloc::vec::Vec;

Nom : rust-language.png
Affichages : 1568
Taille : 4,2 Ko

MaybeUninit<T> à la place de mem::uninitialized

Dans les versions précédentes de Rust, la fonction mem :: uninitialized vous permettait de contourner les vérifications d'initialisation de Rust en prétendant que vous aviez initialisé une valeur au type T sans rien faire. L’une des utilisations principales de cette fonction a été d’allouer des tableaux paresseux.

Cependant, mem :: uninitialized est une opération extrêmement dangereuse qui ne peut essentiellement pas être utilisée correctement car le compilateur Rust suppose que les valeurs sont correctement initialisées. Par exemple, l'appel de mem :: uninitialized :: <bool> () provoque un comportement indéfini instantané car, du point de vue de Rust, les octets non initialisés ne sont ni 0 (pour faux) ni 1 (pour vrai) - les deux seuls modèles d'octets autorisés. pour bool.

Pour remédier à cette situation, dans Rust 1.36.0, le type MaybeUninit <T> a été stabilisé. Le compilateur Rust comprendra qu’il ne doit pas présumer que MaybeUninit <T> est un T correctement initialisé. Par conséquent, vous pouvez effectuer l’initialisation progressive de manière plus sécurisée et utiliser éventuellement .assume_init () une fois que vous êtes certain que Maybe_t: MaybeUninit <T> contient un T. initialisé.

Comme MaybeUninit <T> est l’alternative la plus sûre, à partir de Rust 1.38, la fonction mem :: uninitialized sera obsolète.

NLL pour Rust 2015

Dans l'annonce de Rust 1.31.0, l'équipe avait parlé de NLL (Non-Lexical Lifetimes - Durée de vie non lexicale), une amélioration du langage qui rend le borrow checker plus intelligent et plus convivial. Par exemple, vous pouvez maintenant écrire:

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
fn main() {
    let mut x = 5;
    let y = &x;
    let z = &mut x; // This was not allowed before 1.31.0.
}

Dans la version 1.31.0, NLL n'était stabilisé que pour Rust 2018, avec la promesse de le reporter également dans Rust 2015. Avec Rust 1.36.0, l'équipe annonce que c'est désormais le cas ! NLL est maintenant disponible pour Rust 2015.

Avec NLL dans les deux éditions, elle envisage de supprimer l'ancien borrow checker. Cependant, ce dernier a malheureusement accepté un code non sain qu'il n'aurait pas dû. En conséquence, NLL est actuellement dans un "mode de migration" dans lequel l'équipe va émettre des avertissements au lieu d’erreurs si le borrow checker NLL rejette le code que l’ancien vérificateur d’emprunt AST accepterait.

Une nouvelle implémentation de HashMap <K, V>

Dans Rust 1.36.0, l’implémentation de HashMap <K, V> a été remplacée par celle du crate hashbrown, basée sur la conception de SwissTable. Bien que l'interface soit la même, l'implémentation de HashMap <K, V> est maintenant plus rapide en moyenne et nécessite moins de mémoire. Notez que contrairement au crate hashbrown, l’implémentation dans std utilise toujours l’algorithme de hachage SipHash 1-3.

Support de -- offline dans Cargo

Pendant la plupart des versions, Cargo n'interagit pas avec le réseau. Parfois, cependant, Cargo doit le faire. C'est le cas lorsqu'une dépendance est ajoutée et que la dernière version compatible doit être téléchargée. Parfois, l’accès au réseau n’est pas une option, par exemple dans un avion ou dans des environnements de construction isolés.

Dans Rust 1.36, un nouveau drapeau Cargo a été stabilisé: --offline. L'indicateur modifie l'algorithme de résolution de dépendance de Cargo pour n'utiliser que des dépendances mises en cache localement. Lorsque les crate requises ne sont pas disponibles hors ligne et qu'un accès au réseau serait requis, Cargo se terminera avec une erreur. Pour pré-remplir le cache local en vue de la mise hors ligne, utilisez la commande cargo fetch, qui télécharge toutes les dépendances requises pour un projet.

Changement au niveau de la bibliothèque

La macro dbg! supporte désormais des arguments multiples.

De nombreuses API ont été passées en const à l'instar de :
  • Layout::from_size_align_unchecked
  • mem::needs_drop
  • NonNull::dangling
  • NonNull::cast

De nouvelles API sont désormais disponibles en version stable, comme :
  • task::Waker and task::Poll
  • VecDeque::rotate_left and VecDeque::rotate_right
  • Read::read_vectored and Write::write_vectored
  • Iterator::copied
  • BorrowMut<str> for String
  • str::as_mut_ptr

Source : note de version

Voir aussi :

C2Rust : un outil qui permet de faire la traduction et la refactorisation de votre code écrit en langage C vers le langage Rust
La version 1.35.0 de Rust est disponible avec les traits de fermeture FnOnce, FnMut et Fn pour Box <dyn FnOnce>, Box <dyn FnMut> et Box <dyn Fn>
La feuille de route 2019 de Rust, est disponible et place l'année sous le signe de la maturité