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 cierre es un tipo especial de función que «recuerda» las variables del lugar donde se creó, incluso después de que ese contexto original haya terminado de ejecutarse. Piensa en él como una función que lleva consigo un fragmento de su lugar de origen adondequiera 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 convierte esto en un cierre es que este acceso persiste incluso después de que la función externa haya terminado 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. Captura el parámetro name de su ámbito circundante. Incluso después de que createGreeting termina de ejecutarse, la función devuelta todavía recuerda cuál era name.

Las clausuras son increíblemente útiles para crear funciones especializadas o mantener el estado de una manera clara. Te permiten crear funciones personalizadas según el entorno en el que se crearon, lo que hace que tu código sea más flexible y potente.

challenge icon

Desafío

Fácil

Crea un programa que demuestre los cierres mediante la creación de 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 tipo cadena que represente el nombre de una persona
  2. Lee una entrada de tipo cadena que represente un tipo de saludo ("formal", "casual" o "friendly")
  3. Lee una entrada de tipo cadena que represente el nombre de una empresa
  4. Crea una función llamada createMessageGenerator que reciba un nombre y un tipo de saludo como parámetros
  5. La función createMessageGenerator debe devolver otra función (un cierre) que:
    • Reciba un nombre de empresa como parámetro
    • Utilice el nombre y el tipo de saludo del ámbito de la función externa
    • Devuelva un mensaje formateado según 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 del nombre y del tipo de saludo para obtener tu función de cierre
  7. Llama a la función de cierre devuelta con la entrada del nombre de la empresa para generar el mensaje
  8. Muestra los resultados exactamente en el formato 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 los cierres mediante la creación de una función que devuelva otra función. La función devuelta (cierre) debe tener acceso a las variables del ámbito de la función externa (nombre y tipo de saludo) incluso después de que la función externa haya terminado de ejecutarse. Utiliza instrucciones condicionales para determinar el formato de mensaje apropiado según la entrada del tipo de saludo.

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 debajo
  // Create the createMessageGenerator function that returns a 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

Practica por tu cuenta: Compilador de Dart online