Achim
Achim

Reputation: 15692

Simplest way to match multiple fields of a struct against `None`

I have a Rust struct like this:

pub struct SomeMapping {
    pub id: String,
    pub other_id: Option<String>,
    pub yet_another_id: Option<String>,
    pub very_different_id: Option<String>
}

What is the simplest way to check if all optional ids are not set? I know the syntax like

if let Some(x) = option_value {...}

to extract a value from an Option, but I don't get how to use this in a concise way to check multiple values for None.

Upvotes: 5

Views: 3257

Answers (1)

edwardw
edwardw

Reputation: 13942

You can destructure a structure in pattern matching like so:

pub struct SomeMapping {
    pub id: String,
    pub other_id: Option<String>,
    pub yet_another_id: Option<String>,
    pub very_different_id: Option<String>,
}

fn main() {
    let x = SomeMapping {
        id: "R".to_string(),
        other_id: Some("u".to_string()),
        yet_another_id: Some("s".to_string()),
        very_different_id: Some("t".to_string()),
    };

    if let SomeMapping {
        id: a,
        other_id: Some(b),
        yet_another_id: Some(c),
        very_different_id: Some(d),
    } = x {
        println!("{} {} {} {}", a, b, c, d);
    }
}

It is documented in the Rust book chapter 18.

Upvotes: 8

Related Questions