0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(DAY18) 俺と学ぶRust言語~Option~

Posted at

今日の内容

  • Option

はじめに

前回はジェネリクスについて学びました。
今日は Option について学びます。

Optionとは

Option<T> は、値が「存在する」か「存在しない」かを表現するRustの列挙型(enum)です。値が存在しない場合はNoneで表します。

これはnullを安全に扱う代替手順として設計されており、Rustでは直接的なnullが存在しないため、Option<T>を使うことで値の有無を安全に扱えます。

Optionの定義

Option型は次のように定義されています。
標準ライブラリに用意されています。

enum Option<T> {
    Some(T), // 値が存在する場合
    None,    // 値が存在しない場合
}

ジェネリクスが使われています。

Optionを使うシナリオ

  1. 値が存在するかどうかが分からない場合

    • 例:配列の特定のインデックスに値があるか
  2. 値が無効な場合にNoneを使う

    • 例:設定ファイルが見つからない。データベース検索結果が空など

Optionの基本的な使い方

生成

let some_number: Option<i32> = Some(5); // 値が存在
let no_number: Option<i32> = None;      // 値が存在しない

Optionの値を扱う(match構文)

Optionを使う際、値を取り出す方法としてmatchが基本です。

fn main() {
    let value: Option<i32> = Some(10);
    match value {
        Some(num) => println!("値が存在します: {}", num),
        None => println!("値が存在しません"),
    }
}

3.簡略された取り出し(unwrap)

値が必ず存在すると確信している場合は、unwrapを使います。

let value: Option<i32> = Some(10);
println!("{}", value.unwrap());

unwrapはNoneの場合にプログラムをクラッシュさせることに注意です。

4.値がない場合のデフォルト値(unwrap_or)

unwrap_orを使えば、値がNoneの場合にデフォルト値を指定できます。

let value: Option<i32> = None;
println!("{}", value.unwrap_or(0));

5.関連メソッド

Optionには多くの便利なメソッドが用意されています。

(1) is_someとis_none

let value: Option<i32> = Some(5);
println!("{}", value.is_some());
println!("{}", value.is_none());

(2) map
値を変換します。

let value: Option<i32> = Some(5);
let doubled = value.map(|x| x * 2);
println!("{:?}", doubled);

(3) and_then
値を使ってさらにOptionを返す処理を行います

let value: Option<i32> = Some(5);
let result = value.and_then(|x| if x > 0 { Some(x*2) } else { None });
println!("{:?}", result);

(4) unwrap_or_else
デフォルト値を計算するクロージャを指定します。

let value: Option<i32> = None;
let result = value.unwrap_or_else(|| 42);
println!("{}", result);

Optionの実践例

  1. 配列から値を取得
    Optionを活用すると、配列やベクタのインデックスを安全に扱えます
    fn main() {
        let numbers = vec![10, 20, 30];
        if let Some(value) = numbers.get(1) {
            println!("値が存在します: {}", value);
        } else {
            println!("値が存在しません");
        }
    }
    
  2. 設定ファイルの読み取り
    設定が存在する場合にSome、存在しない場合にNoneを返します
    fn get_config(key: &str) -> Option<&str> {
        if key == "username" {
            Some("Alice")
        } else {
            None
        }
    }
    
    fn main() {
        match get_config("username") {
            Some(value) => println!("設定: {}", value),
            None => println!("設定値が見つかりません"),
        }
    }
    

おわりに

本日はOptionについて学びました。
次回はResultについて学びます。
ご精読ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?