Option::zip în Rust

Combină două opțiuni într-o pereche: Some((a, b)) doar dacă ambele sunt Some, altfel None.

Sintaxă
fn zip<U>(self, other: Option<U>) -> Option<(T, U)>

Ce face Option::zip

a.zip(b) returnează Some((x, y)) când a este Some(x) și b este Some(y). Dacă oricare lipsește, rezultatul este None.

Este util când un calcul are nevoie de două valori opționale în același timp, de exemplu lățimea și înălțimea citite separat.

Parametri

Parametru Descriere
other A doua opțiune.

Ce returnează

Option<(T, U)>.

Exemple

Exemplul 1: Calcul cu două valori opționale

Aria se calculează doar dacă ambele dimensiuni au putut fi citite.

fn citeste(text: &str) -> Option<f64> {
    text.parse().ok()
}

fn main() {
    let perechi = [("4", "2.5"), ("3", "x"), ("", "7")];
    for (l, h) in perechi {
        let aria = citeste(l).zip(citeste(h)).map(|(a, b)| a * b);
        println!("{l:?} x {h:?} -> {aria:?}");
    }
}

Rezultat

"4" x "2.5" -> Some(10.0)
"3" x "x" -> None
"" x "7" -> None

Exemplul 2: Nume și prenume

zip păstrează ambele valori, în ordine, într-un tuplu.

fn main() {
    let prenume = Some("Ana");
    let nume = Some("Popescu");
    let lipsa: Option<&str> = None;

    println!("{:?}", prenume.zip(nume));
    println!("{:?}", prenume.zip(lipsa));
    if let Some((p, n)) = prenume.zip(nume) {
        println!("Bun venit, {p} {n}!");
    }
}

Rezultat

Some(("Ana", "Popescu"))
None
Bun venit, Ana Popescu!

Greșeli frecvente

  • Crezi că zip păstrează valoarea care există când cealaltă lipsește: nu, rezultatul este None.
  • Confunzi Option::zip cu Iterator::zip: primul combină două opțiuni, al doilea două șiruri de elemente.

Comenzi înrudite

  • Option::and_then: Leagă mai mulți pași care pot da None: aplică funcția doar pentru Some, iar funcția returnează la rândul ei un Option.
  • Option::map: Transformă valoarea din Some cu o funcție și păstrează None neschimbat.
  • Option: Tipul care spune „poate există o valoare, poate nu”: Some(valoare) sau None, în locul lui null din alte limbaje.