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ă
zippăstrează valoarea care există când cealaltă lipsește: nu, rezultatul esteNone. - Confunzi
Option::zipcuIterator::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.