Tracks
/
Rust
Rust
/
Temario
/
Collect
Co

Collect en Rust

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

Acerca de Collect

Para entender la función collect es importante saber que se usa para resolver un iterador. Recuerda que un iterador es una secuencia de elementos que se puede encadenar con otros iteradores. Los iteradores son perezosos, es decir, no se ejecutan hasta que llamas a código que consume el iterador. Ese tipo de código incluye los bucles for y los adaptadores de consumo. Los adaptadores de consumo procesan todos los elementos del iterador para producir algún tipo de salida.

collect es uno de esos adaptadores de consumo, y se puede usar para producir una instancia de cualquier tipo que implemente el trait FromIterator. Ese trait está implementado para todas las colecciones de la biblioteca estándar. Como FromIterator está implementado para muchos tipos, necesitas decirle a Rust qué tipo de colección quieres. Por ejemplo, si queremos un Vec<char> a partir de un slice de string, podríamos indicar el tipo en nuestra llamada a collect así

    let my_chars = "Hello, World!".chars().collect::<Vec<char>>();
// since the item type of the `String::chars()` iterator can be inferred to be `char`, we can omit that information
// let my_chars = "Hello, World!".chars().collect::<Vec<_>>();

Los dos puntos dobles y los paréntesis angulares externos (es decir, ::<_>) se conocen como el turbofish. En este caso, el turbofish es una sintaxis más ruidosa de lo que necesitamos. Al especificar el tipo en el propio enlace, collect puede inferir qué colección debe crear con menos ruido sintáctico.

    let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();

Si quisiéramos un String con los caracteres invertidos, podríamos hacerlo así

    let rev_chars: String = "Hello, World!".chars().rev().collect();

La inferencia de tipos de Rust es lo bastante potente como para que a veces no necesitemos una anotación explícita en línea:

fn get_reversed_chars(phrase: &str) -> Vec<char> {
    phrase.chars().rev().collect()
}

El tipo de retorno de la función get_reversed_chars le permite a collect inferir qué colección devolver. Aquí, sin embargo, debemos especificar Vec<char> y no Vec<_>, ya que Rust no realiza inferencia de tipos para las firmas de funciones. Esto es para asegurar que quien lea el código pueda saber rápidamente qué tipos consume y devuelve una función.

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