sábado, 1 de julio de 2023

Rust: String vs str

 


Dado este post, podemos entender los dos tipos de cadenas en 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}");

}

$ cargo run

   Compiling hello_cargo v0.1.0 

    Finished dev [unoptimized + debuginfo] target(s) in 0.51s

     Running `target/debug/hello_cargo`

s1: World

s2: Hello 

s2: Hello World

s3: World


En Rust: 

  • &str una referencia inmutable a un segmento de cadena.
  • String de un búfer de cadena mutable.

&str introduce un segmento de cadena, que es una referencia inmutable a datos de cadena codificados en UTF-8 almacenados en un bloque de memoria. Los literales de cadena ("Hola") se almacenan en el binario del programa.

El tipo String de Rust es un contenedor alrededor de un vector de bytes. Al igual que con un Vec<T>, es propiedad.

Como ocurre con muchos otros tipos, String::from() crea una cadena a partir de un literal de cadena; String::new() crea una nueva cadena vacía, a la que se pueden agregar datos de cadena usando los métodos push() y push_str().

La macro format!() es una forma conveniente de generar una cadena propia a partir de valores dinámicos. Acepta la misma especificación de formato que println!().

Puede tomar prestados segmentos de &str de String a través de & y, opcionalmente, selección de rango.

Para programadores de C++: piense en &str como const char* de C++, pero el que siempre apunta a una cadena válida en la memoria. Rust String es un equivalente aproximado de std::string de C++ (diferencia principal: solo puede contener bytes codificados en UTF-8 y nunca utilizará una optimización de cadena pequeña).

No hay comentarios.:

Publicar un comentario