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.
This slide should take about 10 minutes.
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.- We haven’t discussed the
Dereftrait yet, so at this point this mostly explains the structure of the sidebar in the documentation. StringimplementaDeref<Target = str>, que le proporciona acceso transparente a los métodos destr.- Write and compare
let s3 = s1.deref();andlet s3 = &*s1;.
- We haven’t discussed the
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