Das Rust-Iterator::any-Funktion erkunden

RustRustBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab wird die Funktion Iterator::any diskutiert, die eine Iterator als Eingabe nimmt und true zurückgibt, wenn irgendein Element in der Iterator eine gegebene Prädikat erfüllt, und false sonst. Die Funktion ist als Trait-Methode in der Standardbibliothek von Rust definiert und kann auf jedem Typ verwendet werden, der das Iterator-Trait implementiert. Die Funktion nimmt eine Closure als Argument, die das Prädikat bestimmt, das auf jedes Element in der Iterator angewendet werden soll. Die Closure wird mit dem FnMut-Trait definiert, was bedeutet, dass sie die erfassten Variablen modifizieren kann, aber nicht konsumieren. Die any-Funktion gibt einen booleschen Wert zurück, der angibt, ob das Prädikat von irgendeinem Element in der Iterator erfüllt wird.

Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.

Iterator::any

Iterator::any ist eine Funktion, die wenn ihr eine Iterator übergeben wird, true zurückgibt, wenn irgendein Element das Prädikat erfüllt. Ansonsten false. Ihre Signatur:

pub trait Iterator {
    // Der Typ, über den iteriert wird.
    type Item;

    // `any` nimmt `&mut self` an, was bedeutet, dass der Aufrufer
    // entliehen und modifiziert werden kann, aber nicht konsumiert.
    fn any<F>(&mut self, f: F) -> bool where
        // `FnMut` bedeutet, dass jede erfasste Variable höchstens
        // modifiziert, nicht konsumiert werden darf. `Self::Item`
        // gibt an, dass sie die Argumente an die Closure per Wert
        // erhält.
        F: FnMut(Self::Item) -> bool;
}
fn main() {
    let vec1 = vec![1, 2, 3];
    let vec2 = vec![4, 5, 6];

    // `iter()` für Vecs liefert `&i32`. Entpacken zu `i32`.
    println!("2 in vec1: {}", vec1.iter()    .any(|&x| x == 2));
    // `into_iter()` für Vecs liefert `i32`. Keine Entpackung erforderlich.
    println!("2 in vec2: {}", vec2.into_iter().any(|x| x == 2));

    // `iter()` entleiht nur `vec1` und seine Elemente, sodass sie
    // nochmals verwendet werden können
    println!("vec1 len: {}", vec1.len());
    println!("First element of vec1 is: {}", vec1[0]);
    // `into_iter()` bewegt `vec2` und seine Elemente, sodass sie
    // nicht mehr verwendet werden können
    // println!("First element of vec2 is: {}", vec2[0]);
    // println!("vec2 len: {}", vec2.len());
    // TODO: Entkommentieren Sie die beiden Zeilen oben und sehen Sie sich die Compilerfehler an.

    let array1 = [1, 2, 3];
    let array2 = [4, 5, 6];

    // `iter()` für Arrays liefert `&i32`.
    println!("2 in array1: {}", array1.iter()    .any(|&x| x == 2));
    // `into_iter()` für Arrays liefert `i32`.
    println!("2 in array2: {}", array2.into_iter().any(|x| x == 2));
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Iterator::any-Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.