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.
Défi
FacileCré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.
- Lisez une entrée de type chaîne représentant le nom d’une personne
- Lisez une entrée de type chaîne représentant un type de salutation (
"formal","casual"ou"friendly") - Lisez une entrée de type chaîne représentant le nom d’une entreprise
- Créez une fonction appelée
createMessageGeneratorqui prend un nom et un type de salutation comme paramètres - La fonction
createMessageGeneratordoit 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]!" - Appelez la fonction
createMessageGeneratoravec les entrées de nom et de type de salutation afin d’obtenir votre fonction de fermeture - Appelez la fonction de fermeture renvoyée avec l’entrée de nom d’entreprise afin de générer le message
- 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 successfullySi 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 successfullySi 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 successfullyVotre 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");
}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
1Manipulation avancée des listes
Propriétés de liste : first & lastÉtat de la liste : isEmpty & isNotEmptyInverser une listeAjouter à une liste : insertSuppression dans une liste : removeWhereRechercher dans une liste : indexOfTrier une listeMélanger une listeRécapitulatif - Organisateur de liste4Manipulation avancée des Maps
Itérer sur une MapVérifier les clés et les valeursPropriétés de Map : keys & valuesAjout conditionnel : putIfAbsentSupprimer des entrées d'une MapMaps imbriquéesRécapitulatif - Mise à jour de l'inventaire2Opérations fonctionnelles sur les listes
Transformer avec 'map'Filtrer avec 'where'Utiliser '.toList()'Vérifier des conditions avec 'any'Conditions avec 'every'Trouver avec 'firstWhere'Récapitulatif - Filtrage de données3Les Ensembles
Qu'est-ce qu'un ensemble ?Créer un ensembleAjouter et supprimer des éléments d'un ensembleVérifier la présence d'éléments dans un ensembleConvertir une liste en ensembleUnion d'ensemblesIntersection d'ensemblesDifférence d'ensemblesRécapitulatif - Liste d'invités uniquesEntraînez-vous par vous-même : Compilateur Dart en ligne