Die Umgebung erfassen
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 62 von 66.
Eine der mächtigsten Funktionen von Closures ist ihre Fähigkeit, Variablen aus ihrer umgebenden Umgebung zu erfassen und zu verwenden. Im Gegensatz zu regulären Funktionen können Closures Variablen „sehen“ und auf sie zugreifen, die in demselben Scope existieren, in dem sie definiert wurden.
So funktioniert das Erfassen der Umgebung (Environment Capture):
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Dies wird "The value of x is: 10" ausgeben
}In diesem Beispiel erfasst das Closure die Variable x aus dem umgebenden Scope und verwendet sie innerhalb seines Bodys. Das Closure muss x nicht als Parameter übergeben bekommen – es hat automatisch Zugriff darauf.
Du kannst auch Variablen erfassen und sie in Berechnungen verwenden:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result ist 15Aufgabe
EinfachSie erhalten zwei Eingaben. Die erste Eingabe ist eine Zahl, die einen Basispreis darstellt. Die zweite Eingabe ist eine Zahl, die einen Rabattprozentsatz darstellt. Erstellen Sie eine Closure, die den Rabattprozentsatz aus der Umgebung erfasst und den Endpreis nach Anwendung des Rabatts berechnet. Rufen Sie die Closure mit dem Basispreis auf und geben Sie den Endpreis aus.
Anforderungen:
- Lesen Sie die erste Eingabe (Basispreis) ein und entfernen Sie Leerzeichen
- Parsen Sie diese zu
f64 - Lesen Sie die zweite Eingabe (Rabattprozentsatz) ein und entfernen Sie Leerzeichen
- Parsen Sie diese zu
f64 - Erstellen Sie eine Closure, die einen Parameter (den Basispreis) entgegennimmt und den Rabattprozentsatz aus der Umgebung erfasst
- Die Closure sollte den Endpreis mit der Formel berechnen:
base_price - (base_price * discount / 100.0) - Rufen Sie die Closure mit dem Basispreis auf
- Geben Sie den Endpreis aus
Eingabe:
- Erste Zeile: Ein Basispreis (z. B.
100.0) - Zweite Zeile: Ein Rabattprozentsatz (z. B.
20.0)
Ausgabe:
- Der Endpreis nach Anwendung des Rabatts
Spickzettel
Closures können Variablen aus ihrer Umgebung erfassen und verwenden, ohne dass diese als Parameter übergeben werden müssen.
Einfaches Erfassen der Umgebung:
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Prints "The value of x is: 10"Erfassen von Variablen in Berechnungen:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result is 15Die Closure erfasst multiplier automatisch aus dem umgebenden Gültigkeitsbereich und verwendet die Variable in der Berechnung.
Probier es selbst
use std::io;
fn main() {
// Basispreis einlesen
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// Rabattprozentsatz einlesen
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: Erstelle einen Closure, der den Rabatt erfasst und den Endpreis berechnet
// TODO: Rufe den Closure mit dem Basispreis auf
// Den Endpreis ausgeben
// println!("{}", final_price);
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittener Kontrollfluss
Der 'match'-AusdruckAbgleichen mehrerer WerteBereiche abgleichenDer 'if let'-AusdruckSchleifen als AusdrückeRückblick – Einfacher Befehls-Parser4Daten gruppieren mit Structs
Was ist ein Struct?Übersicht über StructsZugriff auf Struct-FelderVeränderbare StructsStructs als FunktionsparameterTupel-StructsZusammenfassung – Ein Buch-Struct erstellen7Fehlerbehandlung mit 'Result'
Was ist ein 'Result'?'match' mit 'Result' verwendenis_ok() und is_err()Abkürzungen: unwrap und expectDer Fragezeichen-Operator '?'Strings in Zahlen parsenZusammenfassung – Sichere Divisionsfunktion10Closures & Anonyme Funktionen
Was ist ein Closure?Ein einfaches Closure definierenClosures mit ParameternDie Umgebung erfassenRückblick – Einfaches Adder-Closure2Einführung in Vektoren
Was ist ein Vektor?Einen Vektor erstellenElemente mit push hinzufügenZugriff auf Vektor-ElementeÜber einen Vektor iterierenVeränderliche IterationElemente entfernenZusammenfassung – Einfacher Score-Tracker5Schlüssel-Wert-Paare mit Hash Maps
Was ist eine Hash Map?Erstellen einer Hash MapEinfügen von Schlüssel-Wert-PaarenZugreifen auf WerteIterieren über eine Hash MapAktualisieren eines WertesEntfernen eines PaaresZusammenfassung – Wortzähler8Projekt: Einfaches Artikelinventar
Projekt-SetupEinen Artikel hinzufügenLagerbestand prüfenEinen Artikel verkaufenAlles zusammenfügen11Abschluss-Herausforderungen
Wiederholung - Einzigartige ElementeWiederholung - Benutzerprofil-ValidatorWiederholung - Noten-Zusammenfassung3Kommandozeilen-To-Do-Liste
Projekt-SetupEine Aufgabe hinzufügenAlle Aufgaben anzeigenEine Aufgabe entfernenFinaler Code