String
o str
Ahora podemos entender los dos tipos de cadenas de Rust:
fn main() { let s1: &str = "World"; println!("s1: {s1}"); let mut s2: String = String::from("Hello "); println!("s2: {s2}"); s2.push_str(s1); println!("s2: {s2}"); let s3: &str = &s2[6..]; println!("s3: {s3}"); }
Terminología de Rust:
&str
es una referencia inmutable a un slice de una cadena.String
es un búfer de cadena mutable.
-
&str
introduce 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
String
de Rust es un envoltorio que rodea a un vector de bytes. Como sucede conVec<T>
, tiene propiedad. -
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 los datos de la 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
&str
desdeString
mediante&
y, si quieres, puedes seleccionar intervalos. -
Para los programadores de C++: piensa en
&str
como elconst char*
de C++, pero el que siempre apunta a una cadena válida en la memoria.String
de Rust es parecido astd::string
de C++ (la diferencia principal es que solo puede contener bytes codificados en UTF-8 y nunca utilizará una optimización de cadena pequeña).