Implémenter fmt::Display pour List en Rust

RustRustBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

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 avec rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/integer_types -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/function_syntax -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/expressions_statements -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/method_syntax -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/traits -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} rust/operator_overloading -.-> lab-99189{{"Implémenter fmt::Display pour List en Rust"}} end

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.