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 fermeture (closure) est un type spécial de fonction qui « se souvient » des 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 transporte avec elle un morceau 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 (closure), 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 retournée par createGreeting est une fermeture (closure). Elle capture le paramètre name depuis sa portée environnante. Même après que createGreeting ait fini de s'exécuter, la fonction retournée se souvient toujours de ce que name était.

Les fermetures (closures) sont incroyablement utiles pour créer des fonctions spécialisées ou pour maintenir un état de manière propre. Elles vous permettent de construire des fonctions personnalisées en fonction de l'environnement dans lequel elles ont été créées, rendant votre code plus flexible et puissant.

challenge icon

Défi

Facile

Créez un programme qui illustre les fermetures (closures) en construisant un système de génération de messages personnalisés. Votre programme créera des fonctions qui « se souviennent » d'informations spécifiques et utilisent ces informations pour générer des messages personnalisés même après que le contexte d'origine a été fermé.

  1. Lisez une chaîne de caractères en entrée représentant le nom d'une personne
  2. Lisez une chaîne de caractères en entrée représentant un type de salutation ("formal", "casual", ou "friendly")
  3. Lisez une chaîne de caractères en entrée 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 retourner une autre fonction (une fermeture) qui :
    • Prend un nom d'entreprise comme paramètre
    • Utilise le nom et le type de salutation provenant de la portée de la fonction externe
    • Retourne un message formaté basé sur 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 pour obtenir votre fonction de fermeture
  7. Appelez la fonction de fermeture retournée avec l'entrée du nom de l'entreprise pour générer le message
  8. Affichez les résultats dans le format exact 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 en retourne une autre. La fonction retournée (fermeture) doit avoir accès aux variables de la portée de la fonction externe (nom et type de salutation) même après que la fonction externe a fini de s'exécuter. Utilisez des instructions conditionnelles pour déterminer le format de message approprié en fonction de l'entrée du type de salutation.

Aide-mémoire

Une fermeture (closure) est une fonction qui « se souvient » des 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.

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. 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 fermeture. 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 ce qu'était name.

Les fermetures sont utiles pour créer des fonctions spécialisées ou maintenir un état de manière propre. Elles vous permettent de construire des fonctions personnalisées en fonction de l'environnement dans lequel elles ont été créées.

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
  // Créer la fonction createMessageGenerator qui retourne une fermeture (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