String

String é uma string UTF-8 expansível:

fn main() {
    let mut s1 = String::new();
    s1.push_str("Olá");
    println!("s1: tam = {}, capacidade = {}", s1.len(), s1.capacity());

    let mut s2 = String::with_capacity(s1.len() + 1);
    s2.push_str(&s1);
    s2.push('!');
    println!("s2: tam = {}, capacidade = {}", s2.len(), s2.capacity());

    let s3 = String::from("🇧🇷");
    println!("s3: tam = {}, número de caracteres = {}", s3.len(), s3.chars().count());
}

String implementa Deref<Target = str>, o que significa que você pode chamar todos os métodos de str em uma String.

This slide should take about 5 minutes.
  • String::new retorna uma nova string vazia, use String::with_capacity quando você sabe a quantidade de dados que você deseja colocar na string.
  • String::len retorna o tamanho da String em bytes (que pode ser diferente de seu comprimento em caracteres).
  • String::chars retorna um iterador com os caracteres de fato. Observe que um char pode ser diferente do que um humano considerará um “caracter” devido a agrupamentos de grafemas (grapheme clusters).
  • Quando as pessoas se referem a strings, elas podem estar falando sobre &str ou String.
  • Quando um tipo implementa Deref<Target = T>, o compilador permitirá que você transparentemente chame métodos de T.
    • Ainda não discutimos o trait Deref, então, neste ponto, isso explica principalmente a estrutura da barra lateral na documentação.
    • String implementa Deref<Target = str> que, de forma transparente, dá acesso aos métodos de str.
    • Escreva e compare let s3 = s1.deref(); e let s3 = &*s1;.
  • String é implementado como um wrapper em torno de um vetor de bytes, muitas das operações que você vê suportadas em vetores também são suportadas em String, mas com algumas garantias extras.
  • Compare as diferentes formas de indexar uma String:
    • Para um caracter usando s3.chars().nth(i).unwrap() onde i está dentro dos limites, fora dos limites.
    • Para uma substring usando s3[0..4], onde essa slice está nos limites dos caracteres ou não.
  • Muitos tipos podem ser convertidos para uma string com o método to_string. Este trait é implementado automaticamente para todos os tipos que implementam Display, então qualquer coisa que possa ser formatada também pode ser convertida para uma string.