Vec::extend_from_slice în Rust

extend_from_slice adaugă copii ale elementelor dintr-un slice; append mută toate elementele altui vector și îl golește.

Sintaxă
pub fn extend_from_slice(&mut self, other: &[T])   // T: Clone
pub fn append(&mut self, other: &mut Vec<T>)        // Rust 1.4

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 append un vector care nu e mut sau fără &mut: a.append(&mut b) cere ambele.
  • Folosești extend_from_slice când nu mai ai nevoie de sursă. Plătești clonarea degeaba; append sau extend(sursa) mută elementele.
  • Încerci extend_from_slice cu elemente care nu implementează Clone: the trait bound `T: Clone` is not satisfied. Mută elementele cu append sau extend.

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.