Cadenas de texto (Strings)
Ahora podemos entender los dos tipos de cadenas de Rust:
&stres un slice de bytes codificados en UTF-8, parecido a&[u8].Stringes un buffer adueñado de bytes codificados en UTF-8, parecido aVec<T>.
fn main() { let s1: &str = "mundo"; println!("s1: {s1}"); let mut s2: String = String::from("¡Hola "); println!("s2: {s2}"); s2.push_str(s1); println!("s2: {s2}"); let s3: &str = &s2[s2.len() - s1.len()..]; println!("s3: {s3}"); }
-
&strintroduce un slice de cadena, que es una referencia inmutable a los datos de cadena codificados en UTF-8 y almacenados en un bloque de memoria. Los literales de cadena ("Hello") se almacenan en el binario del programa. -
El tipo
Stringde Rust es un envoltorio que rodea a un vector de bytes. Como sucede conVec<T>, tiene propietario. -
Al igual que ocurre con muchos otros tipos,
String::from()crea una cadena a partir de un literal de cadena.String::new()crea una cadena vacía a la que se pueden añadir datos de cadena mediante los métodospush()ypush_str(). -
La macro
format!()es una forma práctica de generar una cadena propia a partir de valores dinámicos. Acepta la misma especificación de formato queprintln!(). -
Puedes tomar prestados slices
&strdeStringa través de&y, de forma opcional, la selección de intervalos. Si seleccionas un intervalo de bytes que no esté alineado con los límites de caracteres, la expresión activará un pánico. El iteradorcharsitera sobre los caracteres y se aconseja esta opción a intentar definir los límites de los caracteres correctamente. -
Para los programadores de C++: piensa en
&strcomo elconst char*de C++, pero uno que siempre apunta a una cadena válida en la memoria. ElStringde Rust es parecido astd::stringde C++ (la diferencia principal es que solo puede contener bytes codificados en UTF-8 y nunca utilizará una optimización de cadena pequeña). -
Los literales de cadenas de bytes te permiten crear un valor
&[u8]directamente:fn main() { println!("{:?}", b"abc"); println!("{:?}", &[97, 98, 99]); } -
Las cadenas sin formato te permiten crear un valor
&strcon los escapes inhabilitados:r"\n" == "\\n". Puedes insertar comillas dobles con la misma cantidad de#a cada lado de ellas:fn main() { println!(r#"<a href="link.html">link</a>"#); println!("<a href=\"link.html\">link</a>"); }