問題一覧に戻る
中級パターンマッチング
問題83: パターンマッチング応用
Rustのパターンマッチングは'if'を使ったガード節や@バインディングで強化できます。ガードはパターンに条件を追加し、パターンと条件の両方が真の場合のみマッチします。@バインディングはパターンをテストしながら値全体をキャプチャします。これらの機能により複雑なロジックのための柔軟で表現力豊かなパターンマッチングが可能です。
fn main() {
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8];
for num in &numbers {
match num {
// ifを使ったガード節
x x % 2 == 0 => println!("{} is even", x),
x x > 5 => println!("{} is greater than 5", x),
_ => println!("{} is odd and <= 5", num),
}
}
let point = (3, 4);
match point {
// @バインディングで値全体をキャプチャ
(x, y) @ (3, 4) => {
println!("Point at (3, 4): {:?}", p);
}
(x, y) => println!("Other point: ({}, {})", x, y),
}
let value = Some(42);
match value {
// Optionとガード
Some(x) x > 40 => println!("Got {} > 40", x),
Some(x) => println!("Got {}", x),
None => println!("Nothing"),
}
}