日本の山岳一覧・百名山 API を開発しましたCLICK !

Rust | Option 型と Result 型の使い方

Rust Option & Result
  • URLをコピーしました!

Rust で実装していると、Option 型Result 型をどう扱うかが重要になってきます。

目次

Option 型と Result 型の使い方

Option<T> 型

Option<T>型は 値を存在しないかもしれない値 を表現する列挙型です。

  • None:実行の失敗や値の欠如を示す
  • Some(value):型Tvalueをラップするタプル

match を使った値の確認と取得

Option は値か存在するのか不明な状態なので、matchを使って取り出す必要があります。

fn get_option_value(is_ok: bool) -> Option<usize> {
    if is_ok {
        Some(100)
    } else {
        None
    }
}

fn main() {
    // true: 100が出力される
    // false: Noneが出力される
    match get_option_value(true) {
        None => println!("None"),
        Some(v) => println!("{}", v),
    }
}

if let でSome(value)の値を取得する

Some の場合だけ処理したいなら、if letを使うとスッキリ書くことができます。

fn main() {
    let value: Option<usize> = None;

    // Some(value)ではないため、何も出力されない
    if let Some(v) = value {
        println!("{}", v);
    }
}
fn main() {
    let value: Option<usize> = Some(1000);

    // 1000が出力される
    if let Some(v) = value {
        println!("{}", v);
    }
}

Option 関連のメソッド

Optionには、他にも便利なメソッドがたくさんあります。

Result<T,E> 型

Result<T,E>型は エラーが発生するかもしれない値 を表現する列挙型です。

Result は、他言語でいう例外処理を実装する場所で利用します。

  • Ok<T>:要素Tが見つかった場合
  • Err<E>:要素Eとともにエラーが見つかった場合

慣例により、Okが期待される結果であり、Errは期待されない結果です。

match で結果を取り出す

use std::num::ParseIntError;

fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
    return match chk_number.parse::<i32>() {
        Ok(n) => return Ok(n),
        Err(e) => Err(e),
    };
}

fn main() {
    // "100": 100が出力される
    // "error": invalid digit found in string が出力される
    match get_result("error") {
        Ok(r) => println!("{}", r),
        Err(e) => println!("{}", e),
    }
}

if let で Ok また Err の結果を取り出す

エラー処理を必要としない場面では、if letが便利です。

use std::num::ParseIntError;

fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
    return match chk_number.parse::<i32>() {
        Ok(n) => return Ok(n),
        Err(e) => Err(e),
    };
}

fn main() {
    if let Ok(r) = get_result("10") {
        println!("{}", r);
    }
}

また、ガード節を設ける場面では Err のみを取り出すとスッキリ実装できます。

use std::num::ParseIntError;

fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
    return match chk_number.parse::<i32>() {
        Ok(n) => return Ok(n),
        Err(e) => Err(e),
    };
}

fn main() {
    if let Err(e) = get_result("error") {
        println!("{}", e);
    }
}

Result 関連のメソッド

Result にも便利なメソッドがたくさん用意されています。

専用メソッドを使ったエラーハンドリング

Result と Option のエラーハンドリングについて、別の記事でまとめました!

かなりのボリュームになってます。

まとめ

Rust を学んでいて、取り扱いに困った Option 型と Result 型の使い方を簡単にまとめてみました。

著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥3,208 (2024/04/23 20:06時点 | Amazon調べ)
Rust Option & Result

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次