Ce face String::as_str
as_str() îți dă o privire &str spre textul din String, fără nicio copiere. De cele mai multe ori nu ai nevoie de ea, pentru că &s devine automat &str când funcția cere &str.
Locul unde este cu adevărat necesară este match: ramurile cu literali ("da") au tipul &str, deci valoarea comparată trebuie să fie tot &str: match comanda.as_str() { ... }.
Ce returnează
Un &str valabil cât timp String-ul există și nu este modificat.
Exemple
Exemplul 1: match pe un String
fn raspuns(comanda: String) -> &'static str {
match comanda.as_str() {
"start" => "Pornesc...",
"stop" => "Opresc.",
_ => "Comandă necunoscută",
}
}
fn main() {
for c in ["start", "pauza", "stop"] {
println!("{c}: {}", raspuns(c.to_string()));
}
}
Rezultat
start: Pornesc...
pauza: Comandă necunoscută
stop: Opresc.
Exemplul 2: as_str, &s și &s[..] sunt la fel
fn main() {
let oras = String::from("Oradea");
let a: &str = oras.as_str();
let b: &str = &oras;
let c: &str = &oras[..];
println!("{a} {b} {c}, egale: {}", a == b && b == c);
}
Rezultat
Oradea Oradea Oradea, egale: true
Greșeli frecvente
- Scrii
match s { "da" => ... }cus: String: compilatorul spuneexpected `String`, found `&str`. Adaugă.as_str().
Comenzi înrudite
String: Textul care îți aparține și se poate modifica: UTF-8, pe heap, crește singur. Diferența față de &str.str: Tipul pentru o bucată de text UTF-8 împrumutată (&str): literalii, părți din String, parametrii de funcții.Deref: Trait-ul din spatele operatorului * și al conversiei automate &Box<T> -> &T, &String -> &str (deref coercion).