Comprendere le closure
Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 46 di 65.
Una closure è un tipo speciale di funzione che "ricorda" le variabili del luogo in cui è stata creata, anche dopo che il contesto originale ha terminato l'esecuzione. Immaginala come una funzione che porta con sé un pezzo del luogo in cui è nata, ovunque vada.
Quando crei una funzione all'interno di un'altra funzione, la funzione interna ha accesso alle variabili della funzione esterna. Ciò che rende questa struttura una chiusura è il fatto che questo accesso persiste anche dopo che la funzione esterna ha terminato la sua esecuzione.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}In questo esempio, la funzione anonima restituita da createGreeting è una closure. Acquisisce il parametro name dal suo ambito circostante. Anche dopo che createGreeting ha terminato l'esecuzione, la funzione restituita ricorda ancora quale fosse il valore di name.
Le closure sono incredibilmente utili per creare funzioni specializzate o mantenere lo stato in modo chiaro. Ti permettono di creare funzioni personalizzate in base all'ambiente in cui sono state create, rendendo il tuo codice più flessibile e potente.
Sfida
FacileCrea un programma che dimostri le chiusure creando un sistema personalizzato per generare messaggi. Il tuo programma creerà funzioni che "remember" informazioni specifiche e userà tali informazioni per generare messaggi personalizzati anche dopo che il contesto originale è terminato.
- Leggi una stringa in input che rappresenta il nome di una persona
- Leggi una stringa in input che rappresenta un tipo di saluto (
"formal","casual"o"friendly") - Leggi una stringa in input che rappresenta il nome di un'azienda
- Crea una funzione chiamata
createMessageGeneratorche accetta un nome e un tipo di saluto come parametri - La funzione
createMessageGeneratordovrebbe restituire un'altra funzione (una chiusura) che: - Accetta un nome di azienda come parametro
- Usa il nome e il tipo di saluto dall'ambito della funzione esterna
- Restituisce un messaggio formattato in base al tipo di saluto:
- Per
"formal":"Dear [name], we are pleased to welcome you to [company]." - Per
"casual":"Hey [name]! Welcome to [company]!" - Per
"friendly":"Hi [name], so glad you joined [company]!" - Chiama la funzione
createMessageGeneratorcon il nome e il tipo di saluto in input per ottenere la funzione di chiusura - Chiama la funzione di chiusura restituita con il nome dell'azienda in input per generare il messaggio
- Visualizza i risultati esattamente nel formato mostrato di seguito
Ad esempio, se gli input sono "Alice", "formal" e "TechCorp", il programma dovrebbe produrre:
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 successfullySe gli input sono "Bob", "casual" e "StartupXYZ", il programma dovrebbe produrre:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullySe gli input sono "Carol", "friendly" e "InnovateLab", il programma dovrebbe produrre:
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 successfullyIl tuo programma deve dimostrare le chiusure creando una funzione che restituisce un'altra funzione. La funzione restituita (chiusura) dovrebbe poter accedere alle variabili dell'ambito della funzione esterna (nome e tipo di saluto) anche dopo che la funzione esterna ha terminato l'esecuzione. Usa istruzioni condizionali per determinare il formato del messaggio appropriato in base al tipo di saluto in input.
Provalo tu
import 'dart:io';
void main() {
// Leggi l'input
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// Mostra l'intestazione del sistema
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: Scrivi il tuo codice qui sotto
// Crea la funzione createMessageGenerator che restituisce una closure
// Chiama la funzione e genera il messaggio
// Mostra i risultati finali
print("Generated message: \$message");
print("Message generation completed successfully");
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online