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 con Vec<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étodos push() y push_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 que println!().

  • Puedes tomar prestados slices &str desde String mediante & y, si quieres, puedes seleccionar intervalos.

  • Para los programadores de C++: piensa en &str como el const char* de C++, pero el que siempre apunta a una cadena válida en la memoria. String de Rust es parecido a std::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).