Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Rust 1.42.0 : Pin::{map_unchecked, map_unchecked_mut} ne nécessite plus le type de retour pour implémenter Sized,
Error::description est désormais obsolète

Le , par Stéphane le calme

0PARTAGES

9  0 
Numéros de ligne utiles dans les messages de panique Option et Result

Dans Rust 1.41.1, appeler unwrap() sur une valeur Option::None produirait un message d'erreur ressemblant à ceci:

Code Rust : Sélectionner tout
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /.../src/libcore/macros/mod.rs:15:40

De même, les numéros de ligne dans les messages de panique générés par unwrap_err, expect et expect_err et les méthodes correspondantes sur le type Result, font également référence aux core internes.

Dans Rust 1.42.0, toutes ces huit fonctions produisent des messages de panique qui fournissent le numéro de ligne où elles ont été appelées. Les nouveaux messages d'erreur ressemblent à ceci:

Code Rust : Sélectionner tout
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:2:5

Cela signifie que l'appel non valide pour appeler unwrap était sur la ligne 2 de src/main.rs.

Ce comportement est rendu possible par une annotation, #[track_caller].


matches!

Cette version de Rust s'accompagne d'une nouvelle macro, matches!. Cette macro accepte une expression et un pattern et renvoie true si le modèle correspond à l'expression. En d'autres termes:

Code Rust : Sélectionner tout
1
2
3
4
5
6
7
8
// Using a match expression: 
match self.partial_cmp(other) { 
    Some(Less) => true, 
    _ => false, 
} 
  
// Using the `matches!` macro: 
matches!(self.partial_cmp(other), Some(Less))

Vous pouvez également utiliser des fonctionnalités telles que les pattern | ainsi que if:

Code Rust : Sélectionner tout
1
2
3
4
5
let foo = 'f'; 
assert!(matches!(foo, 'A'..='Z' | 'a'..='z')); 
  
let bar = Some(4); 
assert!(matches!(bar, Some(x) if x > 2));

use proc_macro::TokenStream; fonctionne désormais

Dans Rust 2018, l'équipe a supprimé le besoin de extern crate. Mais les macros procédurales étaient un peu spéciales, et donc lorsque vous écriviez une macro procédurale, vous deviez toujours utiliser extern crate proc_macro ;.

Dans cette version, si vous utilisez Cargo, vous n'avez plus besoin de cette ligne lorsque vous travaillez avec l'édition 2018; vous pouvez l'utiliser comme n'importe quelle autre Crate. Étant donné que la plupart des projets auront déjà une ligne similaire à use proc_macro::TokenStream;, ce changement signifie que vous pouvez supprimer la ligne extern crate proc_macro; et votre code fonctionnera toujours. Cette modification est faible, mais rapproche les macros procédurales du code normal.

Bibliothèques
  • iter::Empty implémente désormais Send et Sync pour tout T
  • Pin::{map_unchecked, map_unchecked_mut} ne nécessite plus le type de retour pour implémenter Sized.
  • io::Cursor implémente maintenant PartialEq et Eq.
  • Layout::new est désormais const.

Compatibilités

Parfois, des erreurs sont commises. La méthode Error::description est maintenant considérée comme l'une de ces erreurs. Le problème vient de sa signature de type:

Code Rust : Sélectionner tout
fn description(&self) -> &str

Comme description renvoie a &str, elle n'est pas aussi utile que nous l'aurions souhaité. Cela signifie que vous devez essentiellement renvoyer le contenu d'une Error textuellement. Si vous vouliez dire utilisez la mise en forme pour produire une description plus agréable, c'est impossible : vous devrez renvoyer une chaîne. Au lieu de cela, les types d'erreurs doivent implémenter les traits Display / Debug pour fournir la description de l'erreur.

Cette API existe depuis Rust 1.0. L'équipe travaille depuis longtemps dans ce sens : dans Rust 1.27, l'équipe a fait une légère dépréciation cette méthode. En pratique, cela signifiait qu'elle avait donné à la fonction une implémentation par défaut. Cela signifie que les utilisateurs n'étaient plus obligés d'implémenter cette méthode lors de l'implémentation du trait Error. Dans cette version, elle l'a marqué comme étant obsolète et a pris certaines mesures pour réduire la méthode dans la documentation d'Error. En raison de la politique de stabilité, description ne sera jamais supprimée, c'est donc tout ce que l'équipe peut faire.

Source : note de version

Une erreur dans cette actualité ? Signalez-le nous !