Strings

Agora podemos entender os dois tipos de strings em Rust:

  • &str é uma slice de bytes codificados em UTF-8, similar a &[u8].
  • String é um buffer owned de bytes codificados em UTF-8, similar a Vec<T>.
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[s2.len() - s1.len()..];
    println!("s3: {s3}");
}
This slide should take about 10 minutes.
  • &str introduz uma slice de string, a qual é uma referência imutável para os dados da string UTF-8 armazenados em um bloco de memória. Literais de string ("Olá"), são armazenadas no código binário do programa.

  • O tipo String do Rust é um wrapper (invólucro) ao redor de um vetor 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 pegar emprestado (borrow) slices &str de String via & e opcionalmente seleção de intervalo. Se você selecionar um intervalo de byte que não está alinhado com os limites dos caracteres, a expressão irá retornar um pânico. O iterador chars itera sobre caracteres e é preferível tentar obter os limites dos caracteres corretos.

  • 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).

  • Strings de byte permitem que você crie um valor &[u8] diretamente:

    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • Strings brutas permitem que você crie um valor &str com caracteres de escape desabilitados: r"\n" == "\\n". Você pode embutir aspas duplas utilizando uma quantidade igual de # em ambos os lados das aspas:

    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }