Version Rust 1.38.0: compilation en pipeline, # [obsolète] pour les macros et std :: any :: type_name

L'équipe de développement de Rust est heureuse d'annoncer la sortie d'une nouvelle version, 1.38.0. Rust est un langage de programmation qui permet à chacun de créer des logiciels fiables et efficaces.


Si vous avez installé la version précédente de Rust à l'aide de rustup, pour mettre à niveau vers la version 1.38.0, il vous suffit d'exécuter la commande suivante:


rustup update stable 

Si vous n'avez pas encore installé rustup, vous pouvez l' installer à partir de la page correspondante de notre site Web.


Qu'est-ce qui est inclus dans la version stable?


Le point culminant de cette version est la compilation en pipeline.


Compilation de pipelines


Le compilateur n'a pas besoin de dépendances entièrement assemblées pour construire le paquet, mais seulement leurs "métadonnées" (liste de types, dépendances, exportations, etc.) générées à un stade précoce de la compilation. À partir de Rust 1.38.0, Cargo commencera immédiatement à construire des packages dépendants dès que leurs métadonnées seront disponibles.


Le temps de construction d'un package n'a pas diminué, mais nos tests ont montré que la vitesse de compilation augmente de 10% à 20% dans le cas de builds optimisés (où certaines dépendances sont déjà compilées). Pour les autres packages, une forte augmentation de la vitesse de compilation ne s'est pas produite. Le temps nécessaire pour créer le package dépend de l'ordinateur, les performances peuvent donc varier. La compilation du pipeline est activée automatiquement à partir de la version 1.38.0.


Vérification d'une mauvaise utilisation de mem::{uninitialized, zeroed}


Comme annoncé précédemment , std::mem::uninitialized pas recommandé. À la place, MaybeUninit<T> doit être utilisé.


La fonction mem::uninitialized n'est pas encore obsolète, mais cela sera fait dans les prochaines versions. Mais malgré cela, à partir de la version 1.38.0, rustc recherche une classe étroite d'initialisations incorrectes en utilisant mem::uninitialized ou mem::zeroed .


Pour certains types, tels que &T et Box<T> , une valeur nulle est considérée comme un comportement non défini, car ce sont des objets de type pointeur qui ne doivent pas être null . Ce sera une erreur d'utiliser mem::uninitialized ou mem::zeroed pour initialiser ces types, donc le compilateur essaiera de vous avertir si l'une de ces fonctions est utilisée pour initialiser les objets ci-dessus, et peu importe si elles sont initialisées directement ou comme domaines de grande structure. Cette vérification est récursive, donc le code suivant implique un avertissement:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

Les lecteurs attentifs peuvent remarquer que la bibliothèque standard contient plus de types qui ne doivent pas être remplis de zéros, en particulier NonNull<T> et NonZero<T> . Jusqu'à présent, l'initialisation de ces structures avec mem::uninitialized ou mem::zeroed pas été vérifiée.


Ces vérifications ne couvrent pas tous les cas d'utilisation incorrecte de mem::uninitialized ou mem::zeroed , mais vous permettent de détecter un code incorrect garanti qui devrait basculer vers MaybeUninit .


#[deprecated] pour les macros


L'attribut #[deprecated] , introduit pour la première fois dans Rust 1.9.0, permet aux auteurs de packages d'informer les utilisateurs des fonctionnalités obsolètes qu'ils prévoient de supprimer dans les futures versions. Rust 1.38.0 vous permet d'appliquer cet attribut aux macros.


std::any::type_name


Une représentation sous forme de chaîne du type utilisé peut être nécessaire lors du débogage du code. Par exemple, dans le corps d'une fonction générique, vous souhaiterez peut-être afficher le type de l'argument passé. Maintenant, c'est std::any::type_name avec std::any::type_name :


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

Résultat:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

Comme toutes les fonctions de la bibliothèque standard, destinées uniquement au débogage, cette fonction ne garantit pas le contenu et le format exact de la chaîne. La valeur de retour est la meilleure description du type; plusieurs types peuvent être représentés par le même type_name , mais il peut changer dans les futures versions du compilateur.


Modifications de la bibliothèque standard



De plus, certaines fonctions ont été stabilisées:



Autres changements


La syntaxe , le gestionnaire de paquets de fret et l' analyseur Clippy ont également subi quelques modifications.


Membres 1.38.0


Beaucoup de gens se sont réunis pour créer Rust 1.38.0. Nous n'aurions pas pu faire cela sans vous tous, merci !


Des traducteurs


Pour toute question sur la langue rouille, ils pourront vous aider dans le chat Telegram en russe ou dans un chat similaire pour les nouveaux arrivants .


Cet article a été traduit conjointement par andreevlex , nlinker , funkill et Gymmasssorla .

Source: https://habr.com/ru/post/fr469061/


All Articles