オプションから結果を抽出する

Beginner

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

はじめに

この実験では、Rust の Option 型と Result 型を使ってエラー型を相互に埋め込むことで、混合エラー型を扱う方法を学びます。

注: 実験でファイル名が指定されていない場合は、好きなファイル名を使うことができます。たとえば、main.rs を使って、rustc main.rs &&./main でコンパイルして実行することができます。

Option から Result を抜き出す

混合エラー型を扱う最も基本的な方法は、それらを相互に埋め込むことです。

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!("The first doubled is {:?}", double_first(numbers));

    println!("The first doubled is {:?}", double_first(empty));
    // エラー 1: 入力ベクトルが空です

    println!("The first doubled is {:?}", double_first(strings));
    // エラー 2: 要素が数値にパースできません
}

エラーが発生したときに処理を停止する場合(? を使う場合など)がありますが、OptionNone の場合は処理を続けたいときもあります。ResultOption を入れ替えるのに便利なコンビネータがいくつかあります。

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!("The first doubled is {:?}", double_first(numbers));
    println!("The first doubled is {:?}", double_first(empty));
    println!("The first doubled is {:?}", double_first(strings));
}

まとめ

おめでとうございます!あなたは Option から Result を抜き出す実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習することができます。