Ce face Vec::extend_from_slice
extend_from_slice(&alt) adaugă la final o copie (clone) a fiecărui element din alt. Sursa rămâne neschimbată și poate fi un tablou, un vector sau o bucată de vector. Elementele trebuie să implementeze Clone.
append(&mut alt) mută toate elementele din vectorul alt la finalul vectorului curent, fără să le cloneze, iar alt rămâne gol (dar utilizabil). Pentru String-uri sau alte valori mari, append este mai ieftin.
Mai general, extend(iterator) (din trait-ul Extend) adaugă elementele oricărui iterator: alt vector consumat, un map, un interval.
Parametri
| Parametru | Descriere |
|---|---|
other |
La extend_from_slice: slice-ul ale cărui elemente se copiază. La append: vectorul golit, primit ca &mut. |
Ce returnează
Nimic; vectorul curent este modificat.
Exemple
Exemplul 1: Copiere față de mutare
fn main() {
let mut lista = vec!["pâine", "lapte"];
let extra = ["ouă", "unt"];
lista.extend_from_slice(&extra);
println!("lista: {:?}", lista);
println!("extra rămâne: {:?}", extra);
let mut a = vec![1, 2, 3];
let mut b = vec![4, 5];
a.append(&mut b);
println!("a = {:?}, b = {:?} (golit)", a, b);
}
Rezultat
lista: ["pâine", "lapte", "ouă", "unt"]
extra rămâne: ["ouă", "unt"]
a = [1, 2, 3, 4, 5], b = [] (golit)
Exemplul 2: Trei moduri de a uni liste de elevi
extend_from_slice clonează fiecare String, append le mută, iar extend primește orice iterator.
fn main() {
let grupa_a = vec![String::from("Ana"), String::from("Mihai")];
let mut grupa_b = vec![String::from("Ioana"), String::from("Radu")];
let mut toti = Vec::new();
toti.extend_from_slice(&grupa_a);
toti.append(&mut grupa_b);
toti.extend(["Elena", "Paul"].map(String::from));
println!("toți: {:?}", toti);
println!("grupa_a: {:?}, grupa_b: {:?}", grupa_a, grupa_b);
}
Rezultat
toți: ["Ana", "Mihai", "Ioana", "Radu", "Elena", "Paul"]
grupa_a: ["Ana", "Mihai"], grupa_b: []
Greșeli frecvente
- Dai lui
appendun vector care nu emutsau fără&mut:a.append(&mut b)cere ambele. - Folosești
extend_from_slicecând nu mai ai nevoie de sursă. Plătești clonarea degeaba;appendsauextend(sursa)mută elementele. - Încerci
extend_from_slicecu elemente care nu implementeazăClone: the trait bound `T: Clone` is not satisfied. Mută elementele cuappendsauextend.
Comenzi înrudite
Vec::push: push adaugă un element la sfârșitul vectorului; pop îl scoate pe ultimul și îl returnează ca Option.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.Vec::drain: Scoate din vector elementele dintr-un interval de poziții și le dă înapoi ca iterator, mutate (fără copiere).Iterator::chain: Lipește două șiruri de valori: produce întâi toate elementele primului, apoi pe ale celui de-al doilea.