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.