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.
Desafío
FácilCrea 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.
- Lee una entrada de cadena que represente el nombre de una persona
- Lee una entrada de cadena que represente un tipo de saludo (
"formal","casual", o"friendly") - Lee una entrada de cadena que represente el nombre de una empresa
- Crea una función llamada
createMessageGeneratorque tome un nombre y un tipo de saludo como parámetros - La función
createMessageGeneratordebe 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]!" - Llama a la función
createMessageGeneratorcon las entradas de nombre y tipo de saludo para obtener tu función de clausura - Llama a la función de clausura devuelta con la entrada del nombre de la empresa para generar el mensaje
- 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 successfullySi 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 successfullySi 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 successfullyTu 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");
}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
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario7Funciones avanzadas
Funciones anónimasPasar funciones como argumentosEntendiendo los ClosuresIntroducción a la recursividadFunción recursiva: Cuenta regresivaFunción recursiva: FactorialResumen - Procesador de listas2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única