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șteget. - Uiți că
getreturnează o referință înOption:let x: i32 = v.get(0);nu compilează. Scriev.get(0).copied().unwrap_or(0)sau tratează cumatch. - Încerci
v.get(-1)pentru ultimul element, ca în Python. Indicii suntusize(fără semn); pentru ultimul element foloseștev.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.