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
- 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.
```rust
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.
```rust
let the_words: Vec<Words> = words_context
.vocabularies
.drain(..)
.filter(|voc| voc.metadata.identifier == words_id)
.collect();
```
-
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 acollect()
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();
-
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.