2026-09-15
guard_or.rs
fn label(n: u32, verbose: bool) -> &'static str {
match n {
0 | 1 if verbose => "tiny",
0 => "zero",
_ => "many",
}
}
fn main() {
println!("{} {} {}", label(0, false), label(1, false), label(1, true));
}
これは何を出力するでしょうか?
Answer
zero many tiny(その後に改行)。マッチガードif verboseは直前の1だけでなく、0 | 1というアーム全体にかかります。つまり(0 | 1) if verboseであって、0 | (1 if verbose)ではありません。label(0, false)はガードで弾かれて次の0へ、label(1, false)は同じく弾かれて_へ進みます。