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.
Desafío
FácilCrea 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.
- Lee una entrada de tipo cadena que represente el nombre de una persona
- Lee una entrada de tipo cadena que represente un tipo de saludo (
"formal","casual"o"friendly") - Lee una entrada de tipo cadena que represente el nombre de una empresa
- Crea una función llamada
createMessageGeneratorque reciba un nombre y un tipo de saludo como parámetros - La función
createMessageGeneratordebe 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]!" - Llama a la función
createMessageGeneratorcon las entradas del nombre y del tipo de saludo para obtener tu función de cierre - Llama a la función de cierre devuelta con la entrada del nombre de la empresa para generar el mensaje
- 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 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 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");
}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 únicaPractica por tu cuenta: Compilador de Dart online