Pasar funciones como argumentos
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 45 de 65.
En programación, las funciones pueden hacer más que simplemente aceptar valores simples como números o cadenas; también pueden aceptar otras funciones como parámetros. Este poderoso concepto se llama función de orden superior y abre formas completamente nuevas de escribir código flexible y reutilizable.
Cuando pasas una función como argumento, esencialmente le estás dando a otra función la capacidad de decidir qué operación realizar. Piénsalo como si le dieras a alguien una herramienta y dejaras que elija cómo usarla en diferentes materiales.
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}En este ejemplo, processNumbers toma una lista y una función como parámetros. El parámetro de función operation puede ser cualquier función que acepte un entero. Esto significa que podrías pasar una función que imprima números, los duplique o realice cualquier otra operación que necesites.
Este enfoque hace que su código sea increíblemente flexible: en lugar de escribir funciones separadas para cada operación posible, escribe una función que puede trabajar con muchas operaciones diferentes aceptándolas como parámetros.
Desafío
FácilCrea un programa que demuestre cómo pasar funciones como argumentos construyendo un procesador de números flexible. Tu programa creará diferentes funciones de procesamiento y las pasará a una función procesadora principal que aplica la operación a una lista de números.
- Lee una entrada de cadena que contenga números separados por comas (por ejemplo,
"1,2,3,4,5") - Lee una entrada de cadena que represente el tipo de operación (
"double","square", o"increment") - Divide la primera entrada en una lista de cadenas y convierte cada una en un entero
- Crea tres funciones separadas:
doubleNumber- toma un entero y lo devuelve multiplicado por 2squareNumber- toma un entero y lo devuelve multiplicado por sí mismoincrementNumber- toma un entero y lo devuelve más 1- Crea una función principal llamada
processNumbersque tome una lista de enteros y una función como parámetros - La función
processNumbersdebe aplicar la función dada a cada número de la lista y devolver una nueva lista con los resultados - Basándote en la entrada del tipo de operación, pasa la función apropiada a
processNumbers - Muestra los resultados en el formato exacto que se muestra a continuación
Por ejemplo, si las entradas son "2,4,6,8" y "double", tu programa debería mostrar:
Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfullySi las entradas son "3,5,7" y "square", tu programa debería mostrar:
Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfullySi las entradas son "10,20,30" y "increment", tu programa debería mostrar:
Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfullyTu programa debe demostrar el concepto de funciones de orden superior pasando una de las tres funciones de operación como argumento a la función processNumbers. Utiliza sentencias condicionales para determinar qué función pasar basándote en la entrada del tipo de operación. La función processNumbers debe iterar a través de la lista de entrada, aplicar la función dada a cada elemento y recoger los resultados en una nueva lista.
Hoja de referencia
Las funciones de orden superior son funciones que pueden aceptar otras funciones como parámetros, lo que permite un código flexible y reutilizable.
Para pasar una función como argumento, define un parámetro de tipo Function:
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}Esto te permite pasar diferentes funciones para realizar diversas operaciones sobre los mismos datos, haciendo que tu código sea más modular y evitando la necesidad de escribir funciones separadas para cada operación posible.
Pruébalo tú mismo
import 'dart:io';
void main() {
// Leer la entrada
String? numbersInput = stdin.readLineSync();
String? operation = stdin.readLineSync();
// Convertir la cadena de entrada en una lista de enteros
List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
// TODO: Crear las tres funciones de operación (doubleNumber, squareNumber, incrementNumber)
// TODO: Crear la función processNumbers que toma una lista y una función como parámetros
// TODO: Usar sentencias condicionales para determinar qué función pasar según el tipo de operación
// TODO: Llamar a processNumbers con la función adecuada y almacenar el resultado
// Mostrar los resultados en el formato requerido
print('Number Processor');
print('================');
print('Original numbers: $numbers');
print('Operation: $operation');
print('Processing numbers...');
// TODO: Imprimir la lista de resultados aquí
print('Operation 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