Filtern Sie einen Vektor benutzerdefinierter Strukturen in Rust

Nilesh Katuwal 21 Juni 2023
  1. Rostfilter
  2. Korrigieren Sie den Vektor von benutzerdefinierten Strukturen durch Filtern in Rust
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

  1. 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 von iter, 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();
    
  1. 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 von collect() 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();
    
  2. 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.