Menu
Coddy logo textTech

Entendiendo los Closures

Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 46 de 65.

Un closure es un tipo especial de función que "recuerda" las variables del lugar donde fue creada, incluso después de que ese contexto original haya terminado de ejecutarse. Piénsalo como una función que lleva consigo una parte de su lugar de origen a donde quiera que vaya.

Cuando creas una función dentro de otra función, la función interna tiene acceso a las variables de la función externa. Lo que hace que esto sea un closure es que este acceso persiste incluso después de que la función externa haya completado su ejecución.

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

En este ejemplo, la función anónima devuelta por createGreeting es un closure. Captura el parámetro name de su entorno circundante. Incluso después de que createGreeting termine de ejecutarse, la función devuelta todavía recuerda qué era name.

Los closures son increíblemente útiles para crear funciones especializadas o mantener el estado de una manera limpia. Te permiten construir funciones que están personalizadas según el entorno donde fueron creadas, haciendo que tu código sea más flexible y potente.

challenge icon

Desafío

Fácil

Crea un programa que demuestre el uso de clausuras (closures) construyendo un sistema generador de mensajes personalizados. Tu programa creará funciones que "recuerdan" información específica y utilizan esa información para generar mensajes personalizados incluso después de que el contexto original haya finalizado.

  1. Lee una entrada de cadena que represente el nombre de una persona
  2. Lee una entrada de cadena que represente un tipo de saludo ("formal", "casual", o "friendly")
  3. Lee una entrada de cadena que represente el nombre de una empresa
  4. Crea una función llamada createMessageGenerator que tome un nombre y un tipo de saludo como parámetros
  5. La función createMessageGenerator debe devolver otra función (una clausura) que:
    • Tome el nombre de una empresa como su parámetro
    • Utilice el nombre y el tipo de saludo del alcance (scope) de la función externa
    • Devuelva un mensaje formateado basado en el tipo de saludo:
      • Para "formal": "Dear [name], we are pleased to welcome you to [company]."
      • Para "casual": "Hey [name]! Welcome to [company]!"
      • Para "friendly": "Hi [name], so glad you joined [company]!"
  6. Llama a la función createMessageGenerator con las entradas de nombre y tipo de saludo para obtener tu función de clausura
  7. Llama a la función de clausura devuelta con la entrada del nombre de la empresa para generar el mensaje
  8. Muestra los resultados en el formato exacto que se muestra a continuación

Por ejemplo, si las entradas son "Alice", "formal", y "TechCorp", tu programa debería mostrar:

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 las entradas son "Bob", "casual", y "StartupXYZ", tu programa debería mostrar:

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 las entradas son "Carol", "friendly", y "InnovateLab", tu programa debería mostrar:

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

Tu programa debe demostrar las clausuras creando una función que devuelva otra función. La función devuelta (clausura) debe tener acceso a las variables del alcance de la función externa (nombre y tipo de saludo) incluso después de que la función externa haya terminado de ejecutarse. Utiliza sentencias condicionales para determinar el formato de mensaje apropiado basado en la entrada del tipo de saludo.

Hoja de referencia

Un cierre (closure) es una función que "recuerda" variables del lugar donde fue creada, incluso después de que ese contexto original haya terminado de ejecutarse.

Cuando creas una función dentro de otra función, la función interna tiene acceso a las variables de la función externa. Este acceso persiste incluso después de que la función externa haya completado su ejecución.

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

En este ejemplo, la función anónima devuelta por createGreeting es un cierre (closure). Captura el parámetro name de su entorno circundante. Incluso después de que createGreeting termine de ejecutarse, la función devuelta todavía recuerda cuál era el valor de name.

Los cierres (closures) son útiles para crear funciones especializadas o mantener el estado de una manera limpia. Te permiten construir funciones que están personalizadas según el entorno donde fueron creadas.

Pruébalo tú mismo

import 'dart:io';

void main() {
  // Leer entrada
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // Mostrar encabezado del sistema
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Escribe tu código a continuación
  // Crea la función createMessageGenerator que devuelva un cierre (closure)
  // Llama a la función y genera el mensaje
  
  // Mostrar los resultados finales
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo