How do I unwrap an arbitrary number of nested Option types?

Instead of flattening out the nested option, as the other answer shows, I’d advocate that you never create an Option<Option<T>> that you need to flatten in the first place. In the majority of cases I’ve seen, it’s because someone misuses Option::map when they should have used Option::and_then:

fn main() {
    let input = user_input();

    let a = input.map(add1);
    // a is Option<Option<i32>>

    let b = input.and_then(add1);
    // a is Option<i32>
}

fn user_input() -> Option<i32> {
    Some(10)
}

fn add1(a: i32) -> Option<i32> {
    Some(a + 1)
}

Remember that Rust is a statically typed language; you will always know the exact level of nesting.

See also:

Leave a Comment