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::new
devuelve una nueva cadena vacía. UsaString::with_capacity
cuando sepas cuántos datos quieres guardar.String::len
devuelve el tamaño deString
en bytes (que puede ser diferente de su longitud en caracteres).String::chars
devuelve un iterador sobre los caracteres reales. Ten en cuenta que unchar
puede 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
&str
o 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
Deref
trait yet, so at this point this mostly explains the structure of the sidebar in the documentation. String
implementaDeref<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
String
se 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()
, dondei
está 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