String
String Ă© o buffer padrĂŁo de cadeia de caracteres UTF-8 expansĂvel e alocado no heap:
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.
String::newretorna uma nova string vazia, useString::with_capacityquando vocĂȘ sabe a quantidade de dados que vocĂȘ deseja colocar na string.String::lenretorna o tamanho daStringem bytes (que pode ser diferente de seu comprimento em caracteres).String::charsretorna um iterador com os caracteres de fato. Observe que umcharpode 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
&strouString. - Quando um tipo implementa
Deref<Target = T>, o compilador permitirĂĄ que vocĂȘ transparentemente chame mĂ©todos deT.StringimplementaDeref<Target = str>que, de forma transparente, dĂĄ acesso aos mĂ©todos destr.- Escreva e compare
let s3 = s1.deref();elet s3 = &*s1;.
StringĂ© implementado como um wrapper em torno de um vetor de bytes, muitas das operaçÔes que vocĂȘ vĂȘ suportados 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()ondeiestĂĄ 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