Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Crea 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.

  1. Leggi una stringa in input che rappresenta il nome di una persona
  2. Leggi una stringa in input che rappresenta un tipo di saluto ("formal", "casual" o "friendly")
  3. Leggi una stringa in input che rappresenta il nome di un'azienda
  4. Crea una funzione chiamata createMessageGenerator che accetta un nome e un tipo di saluto come parametri
  5. La funzione createMessageGenerator dovrebbe 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]!"
  6. Chiama la funzione createMessageGenerator con il nome e il tipo di saluto in input per ottenere la funzione di chiusura
  7. Chiama la funzione di chiusura restituita con il nome dell'azienda in input per generare il messaggio
  8. 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 successfully

Se 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 successfully

Se 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 successfully

Il 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");
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online