列挙型

タプルと同様に、列挙型もマッチによって分解できます。

パターンは、値の一部に変数を束縛するためにも使えます。これは、 型の構造を調べる方法です。まずは単純な enum 型から始めましょう。

// 著作権 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

enum Result {
    Ok(i32),
    Err(String),
}

fn divide_in_two(n: i32) -> Result {
    if n % 2 == 0 {
        Result::Ok(n / 2)
    } else {
        Result::Err(format!("cannot divide {n} into two equal parts"))
    }
}

fn main() {
    let n = 100;
    match divide_in_two(n) {
        Result::Ok(half) => println!("{n} divided in two is {half}"),
        Result::Err(msg) => println!("sorry, an error happened: {msg}"),
    }
}

ここでは、各アームを使って Result の値を 分解 しています。最初の アームでは、halfOk バリアントの中の値に束縛されます。2 番目のアームでは、 msg はエラーメッセージに束縛されます。

  • if/else 式は列挙型を返しており、それが後で match によってアンパックされます。
  • 列挙型定義に 3 つ目のバリアントを追加し、コードを実行したときのエラーを表示してみましょう。コードが網羅的でなくなっている箇所と、コンパイラがどのようにヒントを与えようとするかを指摘してください。
  • 列挙型の各バリアント内の値にアクセスできるのは、パターンマッチした後だけです。
  • 網羅的でない場合に何が起きるかを示してください。すべてのケースが処理されていることを確認してくれるという、Rust コンパイラの利点に注目してください。
  • 構造体風のバリアントを列挙型定義と match に追加して、その構文を示してください。これが構造体に対するマッチと構文的にどのように似ているかを指摘してください。