Introduction
Dans ce laboratoire, nous implémentons fmt::Display pour une structure appelée List qui contient un Vec en Rust. Le défi est de traiter chaque élément séquentiellement en utilisant la macro write!, car elle génère un fmt::Result qui doit être correctement géré. Pour y remédier, nous pouvons utiliser l'opérateur ? pour vérifier si write! renvoie une erreur et la renvoyer si c'est le cas, sinon continuer l'exécution. En implémentant fmt::Display pour List, nous pouvons itérer sur les éléments du vecteur et les imprimer entre crochets, séparés par des virgules. L'exercice est de modifier le programme pour imprimer également l'index de chaque élément dans le vecteur. La sortie attendue après la modification est [0: 1, 1: 2, 2: 3].
Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser
main.rs, le compiler et l'exécuter avecrustc main.rs &&./main.
Testcase: List
Implémenter fmt::Display pour une structure dont les éléments doivent chacun être traités séquentiellement est difficile. Le problème est que chaque write! génère un fmt::Result. Pour gérer correctement ceci, il est nécessaire de traiter tous les résultats. Rust fournit l'opérateur ? précisément à cette fin.
Utiliser ? sur write! ressemble à ceci :
// Essayez `write!` pour voir s'il y a une erreur. Si c'est le cas, renvoyez
// l'erreur. Sinon, continuez.
write!(f, "{}", value)?;
Avec ? disponible, implémenter fmt::Display pour un Vec est simple :
use std::fmt; // Importez le module `fmt`.
// Définissez une structure nommée `List` contenant un `Vec`.
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Extrait la valeur en utilisant l'indexation de tuple,
// et crée une référence à `vec`.
let vec = &self.0;
write!(f, "[")?;
// Itérez sur `v` dans `vec` tout en énumérant le
// compteur d'itération dans `count`.
for (count, v) in vec.iter().enumerate() {
// Pour chaque élément sauf le premier, ajoutez une virgule.
// Utilisez l'opérateur? pour renvoyer en cas d'erreur.
if count!= 0 { write!(f, ", ")?; }
write!(f, "{}", v)?;
}
// Fermez la parenthèse ouvrante et renvoyez une valeur `fmt::Result`.
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
Activité
Essayez de modifier le programme de manière à ce que l'index de chaque élément dans le vecteur soit également imprimé. La nouvelle sortie devrait ressembler à ceci :
[0: 1, 1: 2, 2: 3]
Résumé
Félicitations! Vous avez terminé le laboratoire Testcase: List. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.