String vs str

Agora podemos entender os dois tipos de strings em Rust:

fn main() {
    let s1: &str = "Mundo";
    println!("s1: {s1}");

    let mut s2: String = String::from("Olá ");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");
    
    let s3: &str = &s2[6..];
    println!("s3: {s3}");
}

Terminologia do Rust:

  • &str é uma referência imutável para uma slice de string.
  • String é um buffer de string mutável.
  • &str introduz uma slice de string, a qual é uma referência imutável para os dados da string em formato UTF-8 armazenados em um bloco de memória. Literais de string ("Hello") são armazenadas no código binário do programa.

  • O tipo String do Rust é um invólucro ao redor de uma matriz de bytes. Assim como um Vec<T>, ele é owned.

  • Da mesma forma que outros tipos, String::from() cria uma string a partir de um literal; String::new() cria uma nova string vazia, na qual dados de string podem ser adicionados com os métodos push() e push_str().

  • A macro format!() é uma maneira conveniente de gerar uma string owned a partir de valores dinâmicos. Ela aceita os mesmos formatadores que println!().

  • Você pode emprestar slices &str de String através do operador & e, opcionalmente, selecionar um range (“intervalo”).

  • Para programadores C++: pense em &str como const char* de C++, mas que sempre aponta para uma string válida na memória. Em Rust, String é um equivalente aproximado de std::string de C++ (principal diferença: ele só pode conter bytes codificados em UTF-8 e nunca usará uma otimização de string pequena).