← Rust

LESSON / MIXED

enum・Option・パターンマッチングの基礎

enumによる列挙型の定義、matchによる網羅的な分岐、Option型による「値がないかもしれない」の表現を学びます。

enum:いくつかの決まった値の1つを表す型

enum(列挙型)は、「いくつかある選択肢のうち、どれか1つ」を表す型です。

enum Sign {
    Positive,
    Negative,
    Zero,
}

fn main() {
    let s = Sign::Positive;
}

matchによる分岐

enumの値を調べるときは、matchを使うのが基本です。matchは、考えられるすべてのパターンを網羅していないとコンパイルエラーになります。

enum Sign {
    Positive,
    Negative,
    Zero,
}

fn classify(n: i32) -> Sign {
    if n > 0 {
        Sign::Positive
    } else if n < 0 {
        Sign::Negative
    } else {
        Sign::Zero
    }
}

fn main() {
    let n = -5;
    let result = classify(n);

    match result {
        Sign::Positive => println!("Positive"),
        Sign::Negative => println!("Negative"),
        Sign::Zero => println!("Zero"),
    }
}

matchは数値やboolに対しても使えます。

fn main() {
    let n = 3;

    match n {
        1 => println!("1です"),
        2 | 3 => println!("2か3です"),
        _ => println!("その他です"), // _ はどのパターンにも一致しなかった場合
    }
}

Option型:値がないかもしれないことを表す

Rustには他の言語にあるようなnullがありません。代わりに、「値があるかもしれないし、ないかもしれない」ことをOption<T>という型で表現します。

fn find_first_even(numbers: &Vec<i32>) -> Option<i32> {
    for &n in numbers {
        if n % 2 == 0 {
            return Some(n);
        }
    }
    None
}

fn main() {
    let numbers = vec![1, 3, 5, 6, 7];

    match find_first_even(&numbers) {
        Some(value) => println!("最初の偶数: {}", value),
        None => println!("偶数が見つかりませんでした"),
    }
}
  • 値がある場合はSome(値)
  • 値がない場合はNone

if letによる簡潔な分岐

Someの場合だけを扱いたいとき、matchの代わりにif letを使うと簡潔に書けます。

fn main() {
    let numbers = vec![1, 3, 5, 6, 7];
    let found = numbers.iter().find(|&&n| n % 2 == 0);

    if let Some(value) = found {
        println!("最初の偶数: {}", value);
    } else {
        println!("偶数が見つかりませんでした");
    }
}

演習:数値の符号を判定する

コード提出フォーム

RUST

安全なサーバー側採点連携が未接続のため、現在は提出できません。

採点基盤準備中

公開テストケース

読み込み中…