Menu
Coddy logo textTech

Passare funzioni come argomenti

Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 45 di 65.

Nella programmazione, le funzioni possono fare molto più che accettare semplici valori come numeri o stringhe: possono anche accettare altre funzioni come parametri. Questo potente concetto si chiama funzione di ordine superiore e apre possibilità completamente nuove per scrivere codice flessibile e riutilizzabile.

Quando passi una funzione come argomento, stai essenzialmente dando a un'altra funzione la possibilità di decidere quale operazione eseguire. Immagina di dare a qualcuno uno strumento e lasciargli scegliere come usarlo su materiali diversi.

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

In questo esempio, processNumbers accetta un elenco e una funzione come parametri. Il parametro funzione operation può essere qualsiasi funzione che accetta un numero intero. Questo significa che puoi passare una funzione che stampa i numeri, li raddoppia o esegue qualsiasi altra operazione di cui hai bisogno.

Questo approccio rende il tuo codice incredibilmente flessibile: invece di scrivere funzioni separate per ogni possibile operazione, scrivi una sola funzione che può lavorare con molte operazioni diverse accettandole come parametri.

challenge icon

Sfida

Facile

Crea un programma che mostri come passare funzioni come argomenti realizzando un elaboratore di numeri flessibile. Il programma creerà diverse funzioni di elaborazione e le passerà a una funzione principale di elaborazione, che applicherà l’operazione a un elenco di numeri.

  1. Leggi una stringa di input contenente numeri separati da virgole (ad es., "1,2,3,4,5")
  2. Leggi una stringa di input che rappresenta il tipo di operazione ("double", "square" o "increment")
  3. Dividi il primo input in un elenco di stringhe e converti ciascuna in un intero
  4. Crea tre funzioni separate:
    • doubleNumber - accetta un intero e lo restituisce moltiplicato per 2
    • squareNumber - accetta un intero e lo restituisce moltiplicato per sé stesso
    • incrementNumber - accetta un intero e lo restituisce incrementato di 1
  5. Crea una funzione principale chiamata processNumbers che accetta come parametri un elenco di interi e una funzione
  6. La funzione processNumbers deve applicare la funzione specificata a ogni numero dell’elenco e restituire un nuovo elenco con i risultati
  7. In base al tipo di operazione inserito, passa la funzione appropriata a processNumbers
  8. Visualizza i risultati nel formato esatto mostrato qui sotto

Ad esempio, se gli input sono "2,4,6,8" e "double", il programma dovrebbe produrre:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

Se gli input sono "3,5,7" e "square", il programma dovrebbe produrre:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

Se gli input sono "10,20,30" e "increment", il programma dovrebbe produrre:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

Il programma deve mostrare il concetto di funzioni di ordine superiore passando una delle tre funzioni operative come argomento alla funzione processNumbers. Usa istruzioni condizionali per determinare quale funzione passare in base al tipo di operazione inserito. La funzione processNumbers deve scorrere l’elenco di input, applicare la funzione specificata a ogni elemento e raccogliere i risultati in un nuovo elenco.

Provalo tu

import 'dart:io';

void main() {
  // Leggi l'input
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // Converti l'input di tipo stringa in una lista di numeri interi
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: Crea le tre funzioni per le operazioni (doubleNumber, squareNumber, incrementNumber)
  
  // TODO: Crea la funzione processNumbers che accetta una lista e una funzione come parametri
  
  // TODO: Usa istruzioni condizionali per determinare quale funzione passare in base al tipo di operazione
  
  // TODO: Chiama processNumbers con la funzione appropriata e memorizza il risultato
  
  // Visualizza i risultati nel formato richiesto
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: Stampa qui la lista dei risultati
  print('Operation completed successfully');
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online