モジュールのレッスン (2/2)
パターンマッチング、オプション、および結果
Rust には、パターン マッチングと呼ばれる非常に強力な制御フロー メカニズムがあります。これにより、値を一連のパターンと比較し、一致するパターンに基づいてコードを実行できます。
match ステートメント
Rust の match ステートメントは他の言語の switch に似ていますが、より強力で安全です。コンパイラーは、一致が 完全であることを保証します。これは、考えられるすべてのケースを処理する必要があることを意味します。
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: 値が存在しないことを示します。
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が含まれています。
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 では、ワイルドカード文字 _ を使用して、明示的に定義されていない残りのケースをすべてキャッチできます。
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}自分で試してみてください
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 回の試行後に解決策が利用可能になります
年齢が 18 以上の場合は Ok('Adult') を返し、それ以外の場合は Err('Minor') を返すように check_age 関数を完了します。
ヒントを表示
「if age >= 18」を使用して、「Ok('Adult')」または「Err('Minor')」を返すかを決定します。
3 回の試行後に解決策が利用可能になります
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 回の試行後に解決策が利用可能になります