String::as_str în Rust

String Rust 1.7

Returnează un &str care împrumută tot conținutul String-ului; util la match și unde se cere explicit &str.

Sintaxă
pub fn as_str(&self) -> &str

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" => ... } cu s: String: compilatorul spune expected `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).