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.