Tracks
/
Rust
Rust
/
Temario
/
Collect
Co

Collect en Rust

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

Acerca de Collect

Para entender la función collect es importante saber que se utiliza para resolver un iterador. Recuerda que un iterador es una secuencia de elementos que se puede encadenar con otros iteradores. Los iteradores son perezosos, lo que significa que no se ejecutan hasta que llamas a código que consume el iterador. Ese 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, tienes que indicarle a Rust qué tipo de colección quieres. Por ejemplo, si queremos un Vec<char> a partir de un slice de string, podríamos insertar 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 corchetes angulares externos (es decir, ::<_>) se conocen como el turbofish. En este caso, el turbofish es una sintaxis más ruidosa de lo necesario. Si especificamos el tipo en el propio binding, 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 permite que la función collect infiera qué colección devolver. Aquí, sin embargo, debemos especificar Vec<char> y no Vec<_>, ya que Rust no realiza inferencia de tipos en las firmas de las 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 nueva ventana o pestaña