Extraire les résultats des options

Beginner

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

Introduction

Dans ce laboratoire, nous allons apprendre à gérer différents types d'erreurs en les emboîtant les uns dans les autres à l'aide des types Option et Result en Rust.

Note : Si le nom de fichier n'est pas spécifié dans le laboratoire, 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.

Extraire les Result des Option

La manière la plus simple de gérer différents types d'erreurs est de les emboîter les uns dans les autres.

use std::num::ParseIntError;

fn double_first(vec: Vec<&str>) -> Option<Result<i32, ParseIntError>> {
    vec.first().map(|first| {
        first.parse::<i32>().map(|n| 2 * n)
    })
}

fn main() {
    let numbers = vec!["42", "93", "18"];
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    println!("Le premier doublé est {:?}", double_first(numbers));

    println!("Le premier doublé est {:?}", double_first(empty));
    // Erreur 1 : le vecteur d'entrée est vide

    println!("Le premier doublé est {:?}", double_first(strings));
    // Erreur 2 : l'élément ne peut pas être converti en nombre
}

Il y a des cas où nous voudrons arrêter le traitement en cas d'erreur (comme avec ?) mais continuer quand l'Option est None. Deux combinateurs sont utiles pour inverser Result et Option.

use std::num::ParseIntError;

fn double_first(vec: Vec<&str>) -> Result<Option<i32>, ParseIntError> {
    let opt = vec.first().map(|first| {
        first.parse::<i32>().map(|n| 2 * n)
    });

    opt.map_or(Ok(None), |r| r.map(Some))
}

fn main() {
    let numbers = vec!["42", "93", "18"];
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    println!("Le premier doublé est {:?}", double_first(numbers));
    println!("Le premier doublé est {:?}", double_first(empty));
    println!("Le premier doublé est {:?}", double_first(strings));
}

Sommaire

Félicitations ! Vous avez terminé le laboratoire Pulling Results Out of Options. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.