Namaran

Code daily. Without assist.

2026-09-15

parse_port.rs

fn port(value: Option<&str>) -> Option<u16> {
    // write this: Some(port) only if value is Some,
    // parses as a u16, and is not 0; otherwise None
}

portを、入れ子にしないifを1つだけ使って書いてください。match?は使わないこと。

Reference
fn port(value: Option<&str>) -> Option<u16> {
    if let Some(s) = value
        && let Ok(p) = s.parse::<u16>()
        && p != 0
    {
        Some(p)
    } else {
        None
    }
}

Rust 2024 editionでは、ifの条件でletパターンと普通のbool式を&&でつなげます(let chains)。前のletで束縛したspを後ろの条件でそのまま使え、どこかで失敗すればelseへ進みます。2021 edition以前ではコンパイルエラーになり、if letを入れ子にするしかありませんでした。これは参考実装であり、唯一の正解ではありません。