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, useString::with_capacity
quando você sabe a quantidade de dados que você deseja colocar na string.String::len
retorna o tamanho daString
em bytes (que pode ser diferente de seu comprimento em caracteres).String::chars
retorna um iterador com os caracteres de fato. Observe que umchar
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
ouString
. - Quando um tipo implementa
Deref<Target = T>
, o compilador permitirá que você transparentemente chame métodos deT
.- Ainda não discutimos o trait
Deref
, então, neste ponto, isso explica principalmente a estrutura da barra lateral na documentação. String
implementaDeref<Target = str>
que, de forma transparente, dá acesso aos métodos destr
.- Escreva e compare
let s3 = s1.deref();
elet s3 = &*s1;
.
- Ainda não discutimos o trait
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 emString
, mas com algumas garantias extras.- Compare as diferentes formas de indexar uma
String
:- Para um caracter usando
s3.chars().nth(i).unwrap()
ondei
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.
- Para um caracter usando
- Muitos tipos podem ser convertidos para uma string com o método
to_string
. Este trait é implementado automaticamente para todos os tipos que implementamDisplay
, então qualquer coisa que possa ser formatada também pode ser convertida para uma string.