Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Crea 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.

  1. Lee una entrada de cadena que contenga números separados por comas (por ejemplo, "1,2,3,4,5")
  2. Lee una entrada de cadena que represente el tipo de operación ("double", "square", o "increment")
  3. Divide la primera entrada en una lista de cadenas y convierte cada una en un entero
  4. Crea tres funciones separadas:
    • doubleNumber - toma un entero y lo devuelve multiplicado por 2
    • squareNumber - toma un entero y lo devuelve multiplicado por sí mismo
    • incrementNumber - toma un entero y lo devuelve más 1
  5. Crea una función principal llamada processNumbers que tome una lista de enteros y una función como parámetros
  6. La función processNumbers debe aplicar la función dada a cada número de la lista y devolver una nueva lista con los resultados
  7. Basándote en la entrada del tipo de operación, pasa la función apropiada a processNumbers
  8. 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 successfully

Si 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 successfully

Si 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 successfully

Tu 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');
}
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