Namaran

Code daily. Without assist.

2026-09-15

status.rs

fn status(code: u16, expected: u16) -> &'static str {
    match code {
        expected => "ok",
        _ => "unexpected",
    }
}

codeexpectedと等しいときだけ"ok"を返すつもりですが、status(500, 200)"ok"になります。何が問題で、どう直せばよいでしょうか?

Answer

パターンの位置に書いた識別子は、定数・列挙子・ユニット構造体を指していない限り「その場で新しい変数を束縛する」パターンになり、何にでもマッチします。1つ目のアームはexpectedという新しい変数にcodeを束縛するだけで、引数のexpectedとは比較していません。値との比較はガードで書きます:

match code {
    c if c == expected => "ok",
    _ => "unexpected",
}