Menu
Coddy logo textTech

Closures verstehen

Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 46 von 65.

Ein Closure ist ein spezieller Typ von Funktion, der sich an Variablen aus dem Ort erinnert, an dem er erstellt wurde, selbst nachdem dieser ursprüngliche Kontext die Ausführung beendet hat. Stellen Sie es sich wie eine Funktion vor, die ein Stück ihres Geburtsortes mit sich trägt, egal wohin sie geht.

Wenn Sie eine Funktion innerhalb einer anderen Funktion erstellen, hat die innere Funktion Zugriff auf die Variablen der äußeren Funktion. Was dies zu einem Closure macht, ist, dass dieser Zugriff bestehen bleibt, selbst 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 ein Closure. Sie erfasst den name-Parameter aus ihrem umgebenden Scope. Selbst nachdem createGreeting die Ausführung beendet hat, erinnert sich die zurückgegebene Funktion immer noch daran, was name war.

Closures sind unglaublich nützlich, um spezialisierte Funktionen zu erstellen oder den Zustand auf eine saubere Art und Weise beizubehalten. Sie ermöglichen es Ihnen, Funktionen zu erstellen, die basierend auf der Umgebung, in der sie erstellt wurden, angepasst sind, was Ihren Code flexibler und leistungsfähiger macht.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein Programm, das Closures demonstriert, indem Sie ein System zur Generierung personalisierter Nachrichten aufbauen. Ihr Programm wird Funktionen erstellen, die sich an spezifische Informationen "erinnern" und diese Informationen verwenden, um maßgeschneiderte Nachrichten zu generieren, selbst nachdem der ursprüngliche Kontext beendet wurde.

  1. Lesen Sie eine String-Eingabe ein, die den Namen einer Person darstellt
  2. Lesen Sie eine String-Eingabe ein, die einen Grußtyp darstellt ("formal", "casual" oder "friendly")
  3. Lesen Sie eine String-Eingabe ein, die einen Firmennamen darstellt
  4. Erstellen Sie eine Funktion namens createMessageGenerator, die einen Namen und einen Grußtyp als Parameter entgegennimmt
  5. Die Funktion createMessageGenerator sollte eine weitere Funktion (eine Closure) zurückgeben, die:
    • Einen Firmennamen als Parameter entgegennimmt
    • Den Namen und den Grußtyp aus dem Gültigkeitsbereich der äußeren Funktion verwendet
    • Eine formatierte Nachricht basierend auf dem Grußtyp 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]!"
  6. Rufen Sie die Funktion createMessageGenerator mit den Eingaben für Name und Grußtyp auf, um Ihre Closure-Funktion zu erhalten
  7. Rufen Sie die zurückgegebene Closure-Funktion mit der Eingabe des Firmennamens auf, um die Nachricht zu generieren
  8. Zeigen Sie die Ergebnisse in dem unten gezeigten exakten Format an

Wenn die Eingaben beispielsweise "Alice", "formal" und "TechCorp" sind, sollte Ihr 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 successfully

Wenn die Eingaben "Bob", "casual" und "StartupXYZ" sind, sollte Ihr 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 successfully

Wenn die Eingaben "Carol", "friendly" und "InnovateLab" sind, sollte Ihr 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 successfully

Ihr Programm muss Closures demonstrieren, indem es eine Funktion erstellt, die eine andere Funktion zurückgibt. Die zurückgegebene Funktion (Closure) sollte Zugriff auf die Variablen aus dem Gültigkeitsbereich der äußeren Funktion (Name und Grußtyp) haben, selbst nachdem die Ausführung der äußeren Funktion abgeschlossen ist. Verwenden Sie bedingte Anweisungen, um das entsprechende Nachrichtenformat basierend auf der Eingabe des Grußtyps zu bestimmen.

Spickzettel

Eine Closure ist eine Funktion, die sich an Variablen von dem Ort „erinnert“, an dem sie erstellt wurde, selbst nachdem dieser ursprüngliche Kontext die Ausführung beendet hat.

Wenn Sie eine Funktion innerhalb einer anderen Funktion erstellen, hat die innere Funktion Zugriff auf die Variablen der äußeren Funktion. Dieser Zugriff bleibt bestehen, selbst 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. Selbst nachdem createGreeting die Ausführung beendet hat, erinnert sich die zurückgegebene Funktion immer noch daran, was name war.

Closures sind nützlich, um spezialisierte Funktionen zu erstellen oder den Zustand auf saubere Weise beizubehalten. Sie ermöglichen es Ihnen, Funktionen zu erstellen, die basierend auf der Umgebung, in der sie erstellt wurden, angepasst sind.

Probier es selbst

import 'dart:io';

void main() {
  // Eingabe lesen
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // System-Header anzeigen
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Schreiben Sie Ihren Code unten
  // Erstellen Sie die Funktion createMessageGenerator, die einen Closure zurückgibt
  // Rufen Sie die Funktion auf und generieren Sie die Nachricht
  
  // Die Endergebnisse ausgeben
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf