Option::get_or_insert_with în Rust

Dacă opțiunea este None, pune în ea valoarea calculată de funcție; apoi returnează o referință mutabilă la valoare.

Sintaxă
fn get_or_insert_with<F: FnOnce() -> T>(&mut self, f: F) -> &mut T

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_with pe o opțiune care nu este mut: 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.