Filtrar un vector de estructuras personalizadas en Rust

Nilesh Katuwal 21 junio 2023
  1. Filtro de óxido
  2. Arreglar Vector de Estructuras personalizadas filtrando en Rust
Filtrar un vector de estructuras personalizadas en Rust

Este artículo trata sobre cómo filtrar un vector de estructuras personalizadas en Rust.

Filtro de óxido

Una biblioteca para crear predicados y filtros para usar con la función Iterator::filter. Hay tipos y características en esta biblioteca que se pueden usar para crear filtros y luego combinarlos con operadores lógicos como Y, O, NO y otros.

Al implementar el rasgo Filtro, se pueden crear filtros personalizados. Aunque está pensada para usarse en la función Iterator::filter(), la biblioteca se puede usar en otros lugares, incluidas otras funciones.

Ejemplo para el filtrado de óxido de un vector:

let numbers: Vec<i32> = vec![
  10, 20, 30, 40, 50, 60, 70, 80,
];

let even_number = numbers
  .into_iter()
  .filter(|n| n % 2 == 0)
  .collect::<Vec<_>>();

println!("{:?}", even_number);

Producción :

10, 20, 30, 40, 50, 60, 70, 80

Arreglar Vector de Estructuras personalizadas filtrando en Rust

  1. La iteración sobre las referencias debe cambiarse por la iteración sobre los valores reales. La opción predeterminada requiere el hecho de que somos los propietarios del vector.

    Utilice into_iter en lugar de iter para crear un bucle.

    let the_words: Vec<Words> = words_context
       .vocabularies
       .into_iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    

    De lo contrario, podemos “drenar” el iterador si está presente una referencia mutable.

    let the_words: Vec<Words> = words_context
       .vocabularies
       .drain(..)
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    
  1. Clonar los objetos te permitirá duplicarlos. Esto requiere que el tipo en el que está iterando implemente el método Clonar.

    Se recomienda llamar a cloned() inmediatamente después de filtrar y antes de llamar a collect() para evitar clonar algo que se ha descartado previamente.

    let the_words: Vec<Words> = words_context
       .vocabularies
       .iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .cloned()
       .collect();
    
  2. Es mejor recoger un Vec de referencias que de valores. Por lo tanto, se requiere lo siguiente: independientemente de cómo use los artículos después de eso, debe tomar un artículo por referencia en lugar de por valor.

    let the_words: Vec<&Words> = words_context
       .vocabularies
       .iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    

    Solo es necesario especificar el tipo de variable, o la palabra recoger, no ambas a la vez. let the_ word: Vec_ podría usarse al comienzo de los tres ejemplos para permitir que el compilador infiera el tipo de datos contenidos dentro de la colección en función del iterador.