Namaran

Code daily. Without assist.

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)は同じく弾かれて_へ進みます。