Vec::concat în Rust

concat lipește o listă de liste (sau de texte) într-una singură; join face la fel, cu un separator între ele.

Sintaxă
pub fn concat<Item>(&self) -> <Self as Concat<Item>>::Output
pub fn join<Separator>(&self, sep: Separator) -> <Self as Join<Separator>>::Output   // Rust 1.3

Ce face Vec::concat

Pe un slice de vectori ([Vec<T>] sau [[T; N]]), concat() returnează un Vec<T> nou cu toate elementele, în ordine. Pe un slice de texte ([&str] sau [String]), returnează un String.

join(sep) face același lucru, dar pune separatorul între bucăți. Pentru texte, separatorul este un &str: ["Ana", "Mihai"].join(", ") dă "Ana, Mihai". Pentru vectori, separatorul este un element (&T) sau un slice (&[T]).

Originalul nu este modificat; elementele sunt clonate în rezultat. join este cel mai simplu mod de a construi o linie CSV sau o enumerare dintr-un vector de texte.

Parametri

Parametru Descriere
sep La join: separatorul pus între bucăți.

Ce returnează

Un Vec<T> nou (pentru liste de vectori) sau un String nou (pentru liste de texte).

Exemple

Exemplul 1: Unirea grupelor

fn main() {
    let grupe = vec![vec!["Ana", "Mihai"], vec!["Ioana"], vec!["Radu", "Elena"]];
    let toti = grupe.concat();
    println!("{:?}", toti);

    let cu_separator = grupe.join(&"|");
    println!("{:?}", cu_separator);
}

Rezultat

["Ana", "Mihai", "Ioana", "Radu", "Elena"]
["Ana", "Mihai", "|", "Ioana", "|", "Radu", "Elena"]

Exemplul 2: Texte: concat, join și o linie CSV

fn main() {
    let cuvinte = ["Ana", "are", "mere"];
    println!("{}", cuvinte.concat());
    println!("{}", cuvinte.join(" "));

    let orase = vec!["Iași".to_string(), "Cluj".to_string(), "Brașov".to_string()];
    println!("Orașe: {}.", orase.join(", "));

    let linii = vec!["nume,oras", "Ana,Iași", "Mihai,Cluj"];
    println!("{}", linii.join("\n"));
}

Rezultat

Anaaremere
Ana are mere
Orașe: Iași, Cluj, Brașov.
nume,oras
Ana,Iași
Mihai,Cluj

Greșeli frecvente

  • Apelezi join pe un iterator: v.iter().map(..).join(", ") nu există în std. Colectează întâi într-un Vec<String> și apoi apelează join.
  • Încerci join pe un vector de numere ca să obții text: [1, 2].join(", ") nu compilează. Transformă numerele în texte: v.iter().map(|n| n.to_string()).collect::<Vec<_>>().join(", ").

Comenzi înrudite

  • Vec::extend_from_slice: extend_from_slice adaugă copii ale elementelor dintr-un slice; append mută toate elementele altui vector și îl golește.
  • Iterator::flat_map: flatten „turtește” un iterator de colecții într-un singur șir de valori; flat_map aplică întâi o funcție, apoi turtește.
  • Iterator::collect: Consumă iteratorul și adună valorile într-o colecție: Vec, String, HashMap, HashSet, chiar Result sau Option.
  • Vec::to_vec: Creează un Vec nou, cu copii ale elementelor dintr-un slice: dintr-un tablou, dintr-o bucată de vector sau dintr-un &[T].