Ce face Vec::to_vec
to_vec() clonează fiecare element al slice-ului într-un vector nou, pe care îl deții. Este modul obișnuit de a transforma un &[T] (primit ca parametru) într-un Vec<T> pe care îl poți modifica, sorta sau returna.
Pe un Vec întreg, v.to_vec() face același lucru ca v.clone(). Pe o bucată (v[..3].to_vec()) copiază doar acele elemente. Funcționează la fel și to_owned() sau Vec::from(slice).
Ce returnează
Un Vec<T> nou, independent de original.
Exemple
Exemplul 1: Copie modificabilă a unui tablou și a unei bucăți
fn main() {
let tablou = [3, 1, 2];
let mut copie = tablou.to_vec();
copie.push(4);
copie.sort();
println!("tablou: {:?}, copie: {:?}", tablou, copie);
let note = vec![10, 9, 8, 7, 6];
let primele: Vec<i32> = note[..3].to_vec();
println!("primele trei: {:?}", primele);
}
Rezultat
tablou: [3, 1, 2], copie: [1, 2, 3, 4]
primele trei: [10, 9, 8]
Exemplul 2: Funcție care primește &[T] și returnează un Vec nou
fn fara_duplicate(date: &[u32]) -> Vec<u32> {
let mut v = date.to_vec();
v.sort_unstable();
v.dedup();
v
}
fn main() {
let voturi = [3, 1, 3, 2, 1, 3];
println!("{:?}", fara_duplicate(&voturi));
println!("originalul: {:?}", voturi);
}
Rezultat
[1, 2, 3]
originalul: [3, 1, 3, 2, 1, 3]
Greșeli frecvente
- Folosești
to_vec()doar ca să citești datele. Clonarea costă; dacă nu modifici și nu păstrezi copia, lucrează direct cu slice-ul. - Elemente fără
Clone:to_vecnu compilează. Mută elementele în loc să le copiezi (de exemplu cudrainsauinto_iter).
Comenzi înrudite
Vec: Vectorul dinamic din Rust: o listă de elemente de același tip, ținute unul după altul în memorie, care crește singură.Vec::concat: concat lipește o listă de liste (sau de texte) într-una singură; join face la fel, cu un separator între ele.Vec::split_off: Taie vectorul în două la o poziție: primele elemente rămân, restul sunt mutate într-un vector nou returnat.Iterator::cloned: Transformă un iterator de referințe (&T) într-unul de valori (T): copied copiază tipuri simple, cloned clonează orice tip Clone.