ReferĂȘncias de String

Agora podemos entender os dois tipos de string em Rust: &str é quase como &[char], mas com seus dados armazenados em uma codificação de comprimento variåvel (UTF-8).

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.
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 em formato 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 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 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]);
    }