Ce face Option::get_or_insert_with
get_or_insert_with se asigură că opțiunea are o valoare. Dacă este None, apelează funcția, pune rezultatul în opțiune (care devine Some) și returnează &mut T către el. Dacă era deja Some, returnează direct referința la valoarea existentă.
Este modelul clasic pentru o valoare creată „leneș”, la prima folosire: un cache, o conexiune, un buffer.
Parametri
| Parametru | Descriere |
|---|---|
f |
Funcția care creează valoarea, apelată doar dacă opțiunea este None. |
Ce returnează
&mut T, referință la valoarea din opțiune.
Exemple
Exemplul 1: Listă creată la prima folosire
Vectorul de mesaje se creează doar când apare primul mesaj; mesajul „creez lista” apare o singură dată.
fn main() {
let mut mesaje: Option<Vec<&str>> = None;
println!("la început: {mesaje:?}");
for m in ["Salut", "Ce faci?", "Pa"] {
mesaje
.get_or_insert_with(|| {
println!("creez lista");
Vec::new()
})
.push(m);
}
println!("la final: {mesaje:?}");
}
Rezultat
la început: None
creez lista
la final: Some(["Salut", "Ce faci?", "Pa"])
Exemplul 2: Modificarea valorii prin referința primită
fn main() {
let mut vizite: Option<u32> = None;
for _ in 0..3 {
*vizite.get_or_insert_with(|| 0) += 1;
}
println!("vizite: {vizite:?}");
}
Rezultat
vizite: Some(3)
Greșeli frecvente
- Folosești
get_or_insert_withpe o opțiune care nu estemut: metoda modifică opțiunea. - Ții referința primită și încerci în același timp să citești opțiunea: împrumutul mutabil ține până la ultima folosire a referinței.
Comenzi înrudite
Option::unwrap_or: Scoate valoarea din Some sau, pentru None, folosește o valoare de rezervă: fixă, calculată de o funcție sau implicită.Option::take: take scoate valoarea și lasă None în loc; replace pune o valoare nouă și o returnează pe cea veche.OnceLock: Celulă care primește o valoare o singură dată, sigur între fire; ideală pentru valori globale calculate la prima folosire.