Menu
Coddy logo textTech

Comprendre les closures

Fait partie de la section Logique & Flux du Journey Dart de Coddy. Leçon 46 sur 65.

Une closure est un type spécial de fonction qui « mémorise » les variables de l’endroit où elle a été créée, même après que ce contexte d’origine a fini de s’exécuter. Considérez-la comme une fonction qui emporte avec elle une partie de son lieu de naissance partout où elle va.

Lorsque vous créez une fonction à l’intérieur d’une autre fonction, la fonction interne a accès aux variables de la fonction externe. Ce qui en fait une fermeture, c’est que cet accès persiste même après que la fonction externe a terminé son exécution.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

Dans cet exemple, la fonction anonyme renvoyée par createGreeting est une closure. Elle capture le paramètre name de sa portée environnante. Même après que createGreeting a fini de s’exécuter, la fonction renvoyée se souvient toujours de la valeur de name.

Les closures sont extrêmement utiles pour créer des fonctions spécialisées ou maintenir un état de manière claire. Elles vous permettent de créer des fonctions personnalisées en fonction de l’environnement dans lequel elles ont été créées, ce qui rend votre code plus flexible et plus puissant.

challenge icon

Défi

Facile

Créez un programme qui démontre les fermetures en construisant un système générateur de messages personnalisés. Votre programme créera des fonctions qui « se souviennent » d’informations spécifiques et utiliseront ces informations pour générer des messages personnalisés, même après la fin du contexte d’origine.

  1. Lisez une entrée de type chaîne représentant le nom d’une personne
  2. Lisez une entrée de type chaîne représentant un type de salutation ("formal", "casual" ou "friendly")
  3. Lisez une entrée de type chaîne représentant le nom d’une entreprise
  4. Créez une fonction appelée createMessageGenerator qui prend un nom et un type de salutation comme paramètres
  5. La fonction createMessageGenerator doit renvoyer une autre fonction (une fermeture) qui :
    • Prend un nom d’entreprise comme paramètre
    • Utilise le nom et le type de salutation de la portée de la fonction externe
    • Renvoie un message formaté selon le type de salutation :
      • Pour "formal" : "Dear [name], we are pleased to welcome you to [company]."
      • Pour "casual" : "Hey [name]! Welcome to [company]!"
      • Pour "friendly" : "Hi [name], so glad you joined [company]!"
  6. Appelez la fonction createMessageGenerator avec les entrées de nom et de type de salutation afin d’obtenir votre fonction de fermeture
  7. Appelez la fonction de fermeture renvoyée avec l’entrée de nom d’entreprise afin de générer le message
  8. Affichez les résultats exactement au format indiqué ci-dessous

Par exemple, si les entrées sont "Alice", "formal" et "TechCorp", votre programme doit afficher :

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

Si les entrées sont "Bob", "casual" et "StartupXYZ", votre programme doit afficher :

Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfully

Si les entrées sont "Carol", "friendly" et "InnovateLab", votre programme doit afficher :

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

Votre programme doit démontrer les fermetures en créant une fonction qui renvoie une autre fonction. La fonction renvoyée (la fermeture) doit pouvoir accéder aux variables de la portée de la fonction externe (le nom et le type de salutation), même après la fin de l’exécution de la fonction externe. Utilisez des instructions conditionnelles pour déterminer le format de message approprié en fonction de l’entrée du type de salutation.

Essayez vous-même

import 'dart:io';

void main() {
  // Lire l'entrée
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // Afficher l'en-tête du système
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Écrivez votre code ci-dessous
  // Create the createMessageGenerator function that returns a closure
  // Appeler la fonction et générer le message
  
  // Afficher les résultats finaux
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur Dart en ligne