Tracks
/
Rust
Rust
/
Temario
/
Slices de string
Sl

Slices de string en Rust

{one: "1 ejercicio", many: "%{count} de ejercicios", other: "%{count} ejercicios"}

Acerca de Slices de string

Rust implementa un array de caracteres de dos maneras: str y String.

str, también conocido como «string slice», normalmente se usa con una referencia, como &str.

Para entender por qué, puede ayudar comprender por qué la siguiente línea de código no compila

const MY_CONST: str = *"Hello, World!";

// the size for values of type `str` cannot be known at compilation time
// the trait `Sized` is not implemented for `str`

Aunque la longitud del literal «Hello, World!» se puede conocer en tiempo de compilación, como str es una secuencia de tamaño desconocido. Pero como referencia a un literal (&str), tiene un «fat pointer» que guarda la dirección y la longitud del literal en memoria. Los fat pointers tienen un tamaño conocido, así que esta línea sí compila

const MY_CONST: &str = "Hello, World!";

Un enlace mutable a un string slice puede reemplazar su valor, pero no modificarlo en el mismo lugar.

Ejemplo

let mut my_str = "Hello, World!";
my_str = "Hi!";
let mut my_string = String::from("Hello");
my_string.push_str(", World!"); // there is no equivalent function to modify &str

Es menos restrictivo usar &str en lugar de &String al definir el parámetro de una función, ya que esto no compila

pub fn main() {
    let my_str: &str = "Hello, World!";
    say_hi(my_str);
}

fn say_hi(phrase: &String) {
    println!("{phrase:?}");
}

// mismatched types
// expected reference `&String`
// found reference `&str`

Un &str no se convierte por coerción en un &String. Pero esto sí compila

pub fn main() {
    let my_string = String::from("Hello, World!");
    say_hi(&my_string)
}

fn say_hi(phrase: &str) {
    println!("{phrase:?}");
}

Un &String sí se convierte por coerción en un &str. Por eso, usar un tipo de parámetro &str suele ser más útil.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva