範囲とのマッチング
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 3/66。
値がある数値の範囲内にあるかどうかを確認する必要がある場合、個々の値に対して別々のアームを記述するのは面倒です。Rustのmatch式は、start..=end構文を使用して連続した値の範囲に対してマッチングを行うことができる範囲パターンをサポートしています。
..= 演算子は閉範囲(inclusive range)を作成します。これは、開始値と終了値の両方がマッチに含まれることを意味します。matchアームで範囲を使用する方法は次のとおりです:
let temp = 20;
match temp {
30..=50 => println!("Hot"),
10..=29 => println!("Warm"),
_ => println!("Cold"),
}この例では、温度が20の場合、10..=29 の範囲に一致し、"Warm" と表示されます。30..=50 の範囲は30と50の両方を含むため、ちょうど30または50の温度はどちらも "Hot" という結果になります。
チャレンジ
簡単入力として年齢を受け取ります。入力を読み取り、整数に変換し、範囲パターンを用いた match 式を使用して、適切な年齢カテゴリをプリントしてください。
要件:
- 年齢が
0..=12の場合は、"Child"とプリントしてください - 年齢が
13..=19の場合は、"Teenager"とプリントしてください - 年齢が
20..=64の場合は、"Adult"とプリントしてください - 年齢が
65..=120の場合は、"Senior"とプリントしてください - それ以外の年齢の場合は、
"Invalid age"とプリントしてください
入力: 年齢を表す単一の整数
出力: 年齢カテゴリをプリントしてください: "Child", "Teenager", "Adult", "Senior", または "Invalid age"
チートシート
match 式における範囲パターンでは、start..=end 構文を使用して、連続した値の範囲に対してマッチングを行うことができます。ここで ..= は閉範囲(開始値と終了値の両方が含まれる範囲)を作成します。
let score = 85;
match score {
90..=100 => println!("Grade: A"),
80..=89 => println!("Grade: B"),
70..=79 => println!("Grade: C"),
60..=69 => println!("Grade: D"),
_ => println!("Grade: F"),
}この例では、85というスコアは 80..=89 の範囲にマッチし、"Grade: B" と出力されます。90..=100 という範囲には、90と100の両方が含まれます。
自分で試してみよう
use std::io;
fn main() {
// 入力を読み込む
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let age: i32 = input.trim().parse().expect("Please enter a valid number");
// TODO: 範囲パターンを使用したmatch式を使って、以下にコードを記述してください
// 結果を出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。