String
String es el búfer de cadena UTF-8 estándar, ampliable y asignado a un heap:
fn main() { let mut s1 = String::new(); s1.push_str("Hello"); println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity()); let mut s2 = String::with_capacity(s1.len() + 1); s2.push_str(&s1); s2.push('!'); println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity()); let s3 = String::from("🇨🇭"); println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count()); }
String implementa [Deref<Target = str>][2], lo que significa que puedes llamar a todos los métodos str en una String.
String::newdevuelve una nueva cadena vacía. UsaString::with_capacitycuando sepas cuántos datos quieres guardar.String::lendevuelve el tamaño deStringen bytes (que puede ser diferente de su longitud en caracteres).String::charsdevuelve un iterador sobre los caracteres reales. Ten en cuenta que uncharpuede ser diferente de lo que un humano consideraría un “caracter”, debido a los grupos de grafemas.- Cuando la gente se refiere a cadenas, pueden estar hablando de
&stro deString. - Cuando un tipo implementa
Deref<Target = T>, el compilador te permite llamar a métodos de forma transparente desdeT.StringimplementaDeref<Target = str>, que le proporciona acceso transparente a los métodos destr.- Escribe y compara
let s3 = s1.deref();ylet s3 = &*s1;.
Stringse implementa como un envoltorio alrededor de un vector de bytes. Muchas de las operaciones que ves como compatibles con vectores también lo son conString, pero con algunas garantías adicionales.- Compara las diferentes formas de indexar
String:- A un carácter mediante
s3. chars().nth(i).unwrap(), dondeiestá dentro o fuera de los límites - A una cadena secundaria mediante
s3[0..4], donde el slice está en los límites de caracteres o no.
- A un carácter mediante