メインコンテンツにスキップ
モジュール 2 · レッスン 2 / 2コース内の 4/14~15 min
モジュールのレッスン (2/2)

パターンマッチング、オプション、および結果

Rust には、パターン マッチングと呼ばれる非常に強力な制御フロー メカニズムがあります。これにより、値を一連のパターンと比較し、一致するパターンに基づいてコードを実行できます。

match ステートメント

Rust の match ステートメントは他の言語の switch に似ていますが、より強力で安全です。コンパイラーは、一致が 完全であることを保証します。これは、考えられるすべてのケースを処理する必要があることを意味します。

Rust
enum Direction {
    North,
    South,
    East,
    West,
}

let dir = Direction::East;

match dir {
    Direction::North => println!("Andiamo a Nord"),
    Direction::South => println!("Andiamo a Sud"),
    Direction::East => println!("Andiamo a Est"),
    Direction::West => println!("Andiamo a Ovest"),
}

値の欠如の処理: Option

Rust には null 値 (null または nil) の概念がありません。代わりに、標準ライブラリは、以下を含むことができる Option<T> という列挙型を定義します。

  • Some(T): T 型の値が含まれます。
  • None: 値が存在しないことを示します。
Rust
let x: Option<i32> = Some(5);
let y: Option<i32> = None;

match x {
    Some(val) => println!("C'e un valore: {}", val),
    None => println!("Nessun valore trovato"),
}

回復可能なエラーの処理: Result

失敗する可能性のある操作 (ファイルの読み取りや文字列を数値に解析するなど) の場合、Rust は Result<T, E> 列挙型を使用します。これには 2 つのバリアントがあります。

  • Ok(T): 操作は成功し、成功値 T が含まれています。
  • Err(E): 操作は失敗し、エラー E が含まれています。
Rust
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
    if denominator == 0.0 {
        Err(String::from("Divisione per zero!"))
    } else {
        Ok(numerator / denominator)
    }
}

Rust のコンパイラのおかげで、Ok 内の値にアクセスする前に Err ケースを処理する必要があり、多くの一般的なランタイム バグを防ぐことができます。

ワイルドカード パターン _

多数のバリアントを持つデータ型 (整数など) を扱う場合、match にすべてのケースをリストすることは不可能です。 Rust では、ワイルドカード文字 _ を使用して、明示的に定義されていない残りのケースをすべてキャッチできます。

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

自分で試してみてください

運動#rust.m2.l2.e1
試行回数: 0読み込み中…

Some(42) を含む、Option<i32> 型のmaybe_value という名前の変数を宣言します。 maybe_value で match ステートメントを使用します。 Some(v) が含まれる場合は「値は: v」と表示され (println を使用)、None が含まれる場合は「値がありません」と表示されます。

エディターを読み込み中…
ヒントを表示

`match mighty_value { Some(v) => println!('value is: {}', v), None => println!('no value') }` ブロックを作成します。

3 回の試行後に解決策が利用可能になります

運動#rust.m2.l2.e2
試行回数: 0読み込み中…

年齢が 18 以上の場合は Ok('Adult') を返し、それ以外の場合は Err('Minor') を返すように check_age 関数を完了します。

エディターを読み込み中…
ヒントを表示

「if age >= 18」を使用して、「Ok('Adult')」または「Err('Minor')」を返すかを決定します。

3 回の試行後に解決策が利用可能になります

運動#rust.m2.l2.e3
試行回数: 0読み込み中…

Active と Inactive のバリアントを含む Status という名前の列挙型を宣言します。 main で、変数 current_status を値 Status::Active で宣言します。最後に、current_status に対して match ステートメントを使用して、ステータスがアクティブの場合は「active」を出力し、ステータスが非アクティブの場合は「inactive」を出力します。

エディターを読み込み中…
ヒントを表示

`enum Status { Active, Inactive }` を使用して main の前に enum を定義します。 main では、「let current_status = Status::Active;」を使用し、バリアントに対して「match」を実行します。

3 回の試行後に解決策が利用可能になります