Rust Schleifen und Bereiche

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 lernen wir, wie man in Rust for-Schleifen und Bereiche verwendet. Wir können die for-Schleife zusammen mit der Bereichsnotation a..b verwenden, um über einen Bereich von Werten zu iterieren. Beispielsweise können wir das FizzBuzz-Programm mit einer for-Schleife statt einer while-Schleife schreiben. Darüber hinaus können wir die Notation ..= für einen Bereich verwenden, der an beiden Enden eingeschlossen ist. Die for-Schleife kann auch auf verschiedene Weise mit Iteratoren interagieren, z. B. indem man iter verwendet, um jedes Element einer Sammlung zu entleihen, into_iter verwendet, um die Sammlung zu konsumieren oder iter_mut verwendet, um jedes Element der Sammlung mutierbar zu entleihen. Jede dieser Methoden bietet eine andere Sicht auf die Daten innerhalb der Sammlung und ermöglicht somit verschiedene Aktionen.

Hinweis: Wenn im Lab kein Dateiname angegeben ist, 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.

for-Schleifen

for und Bereich

Der for in-Konstrukt kann verwendet werden, um über einen Iterator zu iterieren. Eine der einfachsten Möglichkeiten, einen Iterator zu erstellen, ist die Verwendung der Bereichsnotation a..b. Dies liefert Werte von a (inklusiv) bis b (exklusiv) in Schritten von eins.

Schreiben wir FizzBuzz mit for statt while.

fn main() {
    // `n` wird in jeder Iteration die Werte: 1, 2,..., 100 annehmen
    for n in 1..101 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

Alternativ kann a..=b für einen Bereich verwendet werden, der an beiden Enden eingeschlossen ist. Das obige kann wie folgt geschrieben werden:

fn main() {
    // `n` wird in jeder Iteration die Werte: 1, 2,..., 100 annehmen
    for n in 1..=100 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

for und Iteratoren

Das for in-Konstrukt kann auf verschiedene Weise mit einem Iterator interagieren. Wie im Abschnitt über das Iterator-Trait diskutiert, wendet die for-Schleife standardmäßig die into_iter-Funktion auf die Sammlung an. Dies ist jedoch nicht die einzige Möglichkeit, um Sammlungen in Iteratoren umzuwandeln.

into_iter, iter und iter_mut behandeln alle die Umwandlung einer Sammlung in einen Iterator auf verschiedene Weise, indem sie verschiedene Ansichten auf die Daten innerhalb der Sammlung bieten.

  • iter - Dies entleiht jedes Element der Sammlung bei jeder Iteration. Dadurch bleibt die Sammlung unberührt und kann nach der Schleife erneut verwendet werden.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter() {
        match name {
            &"Ferris" => println!("Es gibt einen Rustacean unter uns!"),
            // TODO ^ Versuchen Sie, das & zu löschen und nur "Ferris" zu matchen
            _ => println!("Hallo {}", name),
        }
    }

    println!("names: {:?}", names);
}
  • into_iter - Dies konsumiert die Sammlung, sodass bei jeder Iteration die genauen Daten bereitgestellt werden. Nachdem die Sammlung konsumiert wurde, ist sie nicht mehr für die Wiederverwendung verfügbar, da sie innerhalb der Schleife "verschoben" wurde.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.into_iter() {
        match name {
            "Ferris" => println!("Es gibt einen Rustacean unter uns!"),
            _ => println!("Hallo {}", name),
        }
    }

    println!("names: {:?}", names);
    // FIXME ^ Kommentieren Sie diese Zeile aus
}
  • iter_mut - Dies mutierbar entleiht jedes Element der Sammlung, was es ermöglicht, die Sammlung in-place zu modifizieren.
fn main() {
    let mut names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter_mut() {
        *name = match name {
            &mut "Ferris" => "Es gibt einen Rustacean unter uns!",
            _ => "Hallo",
        }
    }

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

In den obigen Codeausschnitten beachten Sie den Typ der match-Verzweigung, das ist der entscheidende Unterschied in den Typen der Iteration. Der Unterschied im Typ impliziert natürlich auch unterschiedliche Aktionen, die ausgeführt werden können.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das For Loops-Lab abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.