Referencias colgantes

Ahora podemos entender los dos tipos de cadenas de Rust: &str es muy parecida a &[char], pero almacena sus datos en una codificación de longitud variable (UTF-8).

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[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.
This slide should take about 10 minutes.
  • &str introduces a string slice, which is an immutable reference to UTF-8 encoded string data stored in a block of memory. String literals (”Hello”), are stored in the program’s binary.

  • El tipo String de Rust es un envoltorio que rodea a un vector de bytes. Como sucede con Vec<T>, tiene propiedad.

  • As with many other types String::from() creates a string from a string literal; String::new() creates a new empty string, to which string data can be added using the push() and push_str() methods.

  • The format!() macro is a convenient way to generate an owned string from dynamic values. It accepts the same format specification as println!().

  • Puedes tomar prestados slices &str de String a 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 iterador chars itera sobre los caracteres y se aconseja esta opción a intentar definir los límites de los caracteres correctamente.

  • For C++ programmers: think of &str as std::string_view from C++, but the one that always points to a valid string in memory. Rust String is a rough equivalent of std::string from C++ (main difference: it can only contain UTF-8 encoded bytes and will never use a small-string optimization).

  • Byte strings literals allow you to create a &[u8] value directly:

    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }