Should `let match (..) { .. } else` compile?

⚓ Rust    📅 2025-07-28    👤 surdeus    👁️ 11      

surdeus

Warning

This post was published 128 days ago. The information described in this article may have changed.

I wrote a let .. else pattern but then converted the inner check to a match expresion but was surprised it won't compile. Is this intended?

Here reduced:

fn does_not_compile() -> Option<usize> {
    struct Inner {
        value: usize,
    }
    let a = Some(Inner { value: 1337 });

    let Some(b) = match a {
        Some(inner) => Some(inner.value),
        _ => None
    } else {
        return None;
    };

    Some(b)
}

fn compiles_when_we_add_parentheses() -> Option<usize> {
    struct Inner {
        value: usize,
    }
    let a = Some(Inner { value: 1337 });

    let Some(b) = (match a {
        Some(inner) => Some(inner.value),
        _ => None
    }) else {
        return None;
    };

    Some(b)
}

compiler says:

error: right curly brace `}` before `else` in a `let...else` statement not allowed
    --> libs/universe/src/entity.rs:2026:5
     |
2026 |     } else {
     |     ^
     |
help: wrap the expression in parentheses
     |
2023 ~     let Some(b) = (match a {
2024 |         Some(inner) => Some(inner),
2025 |         _ => None
2026 ~     }) else {
     |

2 posts - 2 participants

Read full topic

🏷️ Rust_feed