Closures verstehen
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy. Lektion 46 von 65.
Eine closure ist ein spezieller Funktionstyp, der sich an Variablen von dem Ort „erinnert“, an dem er erstellt wurde, selbst nachdem die Ausführung des ursprünglichen Kontexts beendet ist. Stell dir darunter eine Funktion vor, die überall, wohin sie geht, ein Stück ihres Ursprungsorts mit sich trägt.
Wenn du eine Funktion innerhalb einer anderen Funktion erstellst, hat die innere Funktion Zugriff auf die Variablen der äußeren Funktion. Was dies zu einem Closure macht, ist, dass dieser Zugriff auch dann bestehen bleibt, nachdem die äußere Funktion ihre Ausführung abgeschlossen hat.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}In diesem Beispiel ist die von createGreeting zurückgegebene anonyme Funktion eine Closure. Sie erfasst den Parameter name aus ihrem umgebenden Gültigkeitsbereich. Auch nachdem createGreeting die Ausführung beendet hat, erinnert sich die zurückgegebene Funktion noch daran, was name war.
Closures sind äußerst nützlich, um spezialisierte Funktionen zu erstellen oder den Zustand auf saubere Weise beizubehalten. Sie ermöglichen es dir, Funktionen zu erstellen, die auf Grundlage der Umgebung angepasst werden, in der sie erstellt wurden, wodurch dein Code flexibler und leistungsfähiger wird.
Aufgabe
EinfachErstelle ein Programm, das Closures demonstriert, indem es ein personalisiertes Nachrichtengeneratorsystem erstellt. Dein Programm erstellt Funktionen, die sich bestimmte Informationen „merken“ und diese Informationen verwenden, um angepasste Nachrichten zu generieren, selbst nachdem der ursprüngliche Kontext beendet wurde.
- Lies eine String-Eingabe ein, die den Namen einer Person darstellt
- Lies eine String-Eingabe ein, die einen Begrüßungstyp darstellt (
"formal","casual"oder"friendly") - Lies eine String-Eingabe ein, die einen Firmennamen darstellt
- Erstelle eine Funktion namens
createMessageGenerator, die einen Namen und einen Begrüßungstyp als Parameter entgegennimmt - Die Funktion
createMessageGeneratorsollte eine weitere Funktion (eine Closure) zurückgeben, die: - einen Firmennamen als Parameter entgegennimmt
- den Namen und den Begrüßungstyp aus dem Gültigkeitsbereich der äußeren Funktion verwendet
- eine formatierte Nachricht abhängig vom Begrüßungstyp zurückgibt:
- Für
"formal":"Dear [name], we are pleased to welcome you to [company]." - Für
"casual":"Hey [name]! Welcome to [company]!" - Für
"friendly":"Hi [name], so glad you joined [company]!" - Rufe die Funktion
createMessageGeneratormit den Eingaben für den Namen und den Begrüßungstyp auf, um deine Closure-Funktion zu erhalten - Rufe die zurückgegebene Closure-Funktion mit der Eingabe für den Firmennamen auf, um die Nachricht zu generieren
- Gib die Ergebnisse im unten exakt gezeigten Format aus
Wenn die Eingaben beispielsweise "Alice", "formal" und "TechCorp" lauten, sollte dein Programm Folgendes ausgeben:
Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfullyWenn die Eingaben "Bob", "casual" und "StartupXYZ" lauten, sollte dein Programm Folgendes ausgeben:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullyWenn die Eingaben "Carol", "friendly" und "InnovateLab" lauten, sollte dein Programm Folgendes ausgeben:
Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfullyDein Programm muss Closures demonstrieren, indem es eine Funktion erstellt, die eine weitere Funktion zurückgibt. Die zurückgegebene Funktion (Closure) sollte auch nach Abschluss der Ausführung der äußeren Funktion auf die Variablen aus dem Gültigkeitsbereich der äußeren Funktion (Name und Begrüßungstyp) zugreifen können. Verwende bedingte Anweisungen, um das passende Nachrichtenformat anhand der Eingabe für den Begrüßungstyp zu bestimmen.
Probier es selbst
import 'dart:io';
void main() {
// Eingabe lesen
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// Systemheader anzeigen
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: Schreibe deinen Code darunter
// Create the createMessageGenerator function that returns a closure
// Rufe die Funktion auf und generiere die Nachricht
// Gib die endgültigen Ergebnisse aus
print("Generated message: \$message");
print("Message generation completed successfully");
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige GästelisteÜbe selbstständig: Online-Dart-Compiler