str::to_string în Rust

Copiază un &str într-un String nou, deținut. to_string și to_owned dau același rezultat.

Sintaxă
fn to_string(&self) -> String   // din trait-ul ToString
fn to_owned(&self) -> String    // din trait-ul ToOwned

Ce face str::to_string

Când ai un &str (de exemplu un literal sau o bucată tăiată) și ai nevoie de un String pe care să-l păstrezi într-o structură, să-l returnezi sau să-l modifici, îl copiezi cu to_string() sau to_owned().

to_string vine din trait-ul ToString, care există pentru orice tip cu Display (numere, char, tipuri proprii). to_owned vine din ToOwned și înseamnă „fă-mi o copie deținută” (pentru &[T] dă Vec<T>). Pentru &str ambele sunt la fel de rapide; alege-o pe cea care se citește mai bine.

Ce returnează

Un String nou cu același conținut.

Exemple

Exemplul 1: Din bucăți în String-uri deținute

struct Contact {
    nume: String,
    oras: String,
}

fn din_linie(linie: &str) -> Contact {
    let (nume, oras) = linie.split_once(';').unwrap();
    Contact { nume: nume.to_string(), oras: oras.to_owned() }
}

fn main() {
    let c = din_linie("Ana Popescu;Iași");
    println!("{} locuiește în {}", c.nume, c.oras);
}

Rezultat

Ana Popescu locuiește în Iași

Exemplul 2: to_string pe alte tipuri

fn main() {
    let a = 42.to_string();
    let b = 3.5.to_string();
    let c = 'ș'.to_string();
    let d = true.to_string();
    println!("{a} {b} {c} {d}");
    let v: Vec<u8> = [1u8, 2, 3][..].to_owned();
    println!("{v:?}");
}

Rezultat

42 3.5 ș true
[1, 2, 3]

Greșeli frecvente

  • Copiezi cu to_string() doar ca să dai textul unei funcții care primește &str. Nu e nevoie: dă direct &str-ul.

Comenzi înrudite

  • ToString: Trait-ul metodei to_string(); există automat pentru orice tip cu Display, deci nu se implementează direct.
  • String::from: Creează un String nou (deținut) din &str, char sau alt text, copiind conținutul pe heap.
  • String: Textul care îți aparține și se poate modifica: UTF-8, pe heap, crește singur. Diferența față de &str.
  • Cow: „Clone on write”: ține fie un împrumut, fie o valoare deținută; copiază datele doar dacă trebuie modificate.