Filtern Sie einen Vektor benutzerdefinierter Strukturen in Rust
In diesem Artikel geht es um das Filtern eines Vektors von benutzerdefinierten Strukturen in Rust.
Rostfilter
Eine Bibliothek zum Erstellen von Prädikaten und Filtern zur Verwendung mit der Funktion Iterator::filter
. Es gibt Typen und Merkmale in dieser Bibliothek, die verwendet werden können, um Filter zu erstellen und sie dann mit logischen Operatoren wie AND
, OR
, NOT
und anderen zu kombinieren.
Durch die Implementierung der Eigenschaft Filter
können benutzerdefinierte Filter erstellt werden. Obwohl für die Verwendung in der Funktion Iterator::filter()
vorgesehen, kann die Bibliothek auch an anderen Stellen, einschließlich anderer Funktionen, verwendet werden.
Beispiel für die Rostfilterung eines Vektors:
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);
Ausgang:
10, 20, 30, 40, 50, 60, 70, 80
Korrigieren Sie den Vektor von benutzerdefinierten Strukturen
durch Filtern in Rust
-
Die Iteration über Referenzen sollte gegen eine Iteration über die tatsächlichen Werte ausgetauscht werden. Die Standardoption erfordert die Tatsache, dass wir der Eigentümer des Vektors sind.
Verwenden Sie
into_iter
anstelle voniter
, um eine Schleife zu erstellen.let the_words: Vec<Words> = words_context .vocabularies .into_iter() .filter(|voc| voc.metadata.identifier == words_id) .collect();
Andernfalls können wir den Iterator
leeren
, wenn eine veränderliche Referenz vorhanden ist.let the_words: Vec<Words> = words_context .vocabularies .drain(..) .filter(|voc| voc.metadata.identifier == words_id) .collect();
-
Durch das Klonen der Objekte können Sie sie duplizieren. Dies erfordert, dass der Typ, über den Sie iterieren, die Methode
Clone
implementiert.Es wird empfohlen,
cloned()
unmittelbar nach dem Filtern und vor dem Aufruf voncollect()
aufzurufen, um zu vermeiden, dass etwas geklont wird, das zuvor verworfen wurde.let the_words: Vec<Words> = words_context .vocabularies .iter() .filter(|voc| voc.metadata.identifier == words_id) .cloned() .collect();
-
Es ist besser, einen
Vec
von Referenzen zu sammeln als von Werten. Daher ist Folgendes erforderlich: Wie auch immer Sie die Artikel danach verwenden, Sie müssen einen Artikel als Referenz und nicht als Wert nehmen.let the_words: Vec<&Words> = words_context .vocabularies .iter() .filter(|voc| voc.metadata.identifier == words_id) .collect();
Es muss nur der Variablentyp oder das Wort
collect
angegeben werden, nicht beides gleichzeitig.let the_ word: Vec_
könnte am Anfang aller drei Beispiele verwendet werden, damit der Compiler basierend auf dem Iterator auf die Art der in der Sammlung enthaltenen Daten schließen kann.