Vec::get în Rust

Citește elementul de pe o poziție fără risc de panic: returnează Some(&element) sau None dacă poziția nu există.

Sintaxă
pub fn get<I>(&self, index: I) -> Option<&I::Output>
pub fn get_mut<I>(&mut self, index: I) -> Option<&mut I::Output>

Ce face Vec::get

Indexarea cu paranteze drepte (v[i]) oprește programul dacă poziția nu există. get(i) face aceeași căutare, dar returnează un Option: Some(&element) când poziția este validă și None când nu. Așa tratezi cazul lipsă fără să se oprească programul.

get_mut(i) returnează Option<&mut T>, ca să poți modifica elementul dacă există. Ambele acceptă și intervale: v.get(1..3) returnează Some(&[..]) sau None dacă intervalul iese din vector.

Folosește v[i] când știi sigur că poziția există (de exemplu, într-o buclă 0..v.len()) și get când poziția vine din afara programului: date de la utilizator, dintr-un fișier, dintr-un calcul.

Parametri

Parametru Descriere
index O poziție (usize) sau un interval de poziții (a..b, ..b etc.).

Ce returnează

get: Option<&T> (sau Option<&[T]> pentru interval). get_mut: Option<&mut T>.

Exemple

Exemplul 1: Poziție validă și poziție lipsă

fn main() {
    let orase = vec!["București", "Cluj", "Iași"];
    println!("{:?}", orase.get(1));
    println!("{:?}", orase.get(10));
    match orase.get(5) {
        Some(o) => println!("al 6-lea oraș: {o}"),
        None => println!("nu există un al 6-lea oraș"),
    }
    println!("{:?}", orase.get(1..3));
    println!("{:?}", orase.get(2..9));
}

Rezultat

Some("Cluj")
None
nu există un al 6-lea oraș
Some(["Cluj", "Iași"])
None

Exemplul 2: Modificare doar dacă poziția există

fn main() {
    let mut stoc = vec![10, 0, 25];
    if let Some(s) = stoc.get_mut(1) {
        *s += 50;
    }
    if let Some(s) = stoc.get_mut(7) {
        *s += 50;
    } else {
        println!("poziția 7 nu există, nu modific nimic");
    }
    println!("{:?}", stoc);
}

Rezultat

poziția 7 nu există, nu modific nimic
[10, 50, 25]

Exemplul 3: Ziua săptămânii citită de la tastatură

Utilizatorul scrie numere de la 1 la 7. checked_sub(1) evită depășirea pentru 0, iar get evită panic pentru 9.

use std::io::{self, BufRead};

fn main() {
    let zile = vec!["luni", "marți", "miercuri", "joi", "vineri", "sâmbătă", "duminică"];
    for linie in io::stdin().lock().lines() {
        let linie = linie.expect("eroare la citire");
        let n: usize = linie.trim().parse().unwrap_or(0);
        match n.checked_sub(1).and_then(|i| zile.get(i)) {
            Some(zi) => println!("ziua {n} este {zi}"),
            None => println!("{} nu este o zi a săptămânii", linie.trim()),
        }
    }
}

Ce scrie utilizatorul (intrare)

3
7
9
0

Rezultat

ziua 3 este miercuri
ziua 7 este duminică
9 nu este o zi a săptămânii
0 nu este o zi a săptămânii

Greșeli frecvente

  • Folosești v[i] cu un indice venit de la utilizator. Un număr greșit oprește programul cu index out of bounds. Folosește get.
  • Uiți că get returnează o referință în Option: let x: i32 = v.get(0); nu compilează. Scrie v.get(0).copied().unwrap_or(0) sau tratează cu match.
  • Încerci v.get(-1) pentru ultimul element, ca în Python. Indicii sunt usize (fără semn); pentru ultimul element folosește v.last().

Comenzi înrudite

  • Vec::first: first returnează primul element, last ultimul, ca Option: None dacă vectorul este gol.
  • Vec: Vectorul dinamic din Rust: o listă de elemente de același tip, ținute unul după altul în memorie, care crește singură.
  • Vec::len: len returnează numărul de elemente din vector; is_empty spune dacă vectorul nu are niciun element.
  • HashMap::get: get caută o cheie și returnează Some(&valoare) sau None; contains_key spune doar dacă cheia există.
  • Vec::contains: Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.