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.
Sfida
FacileCrea 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.
- Leggi una stringa di input contenente numeri separati da virgole (ad es.,
"1,2,3,4,5") - Leggi una stringa di input che rappresenta il tipo di operazione (
"double","square"o"increment") - Dividi il primo input in un elenco di stringhe e converti ciascuna in un intero
- Crea tre funzioni separate:
doubleNumber- accetta un intero e lo restituisce moltiplicato per 2squareNumber- accetta un intero e lo restituisce moltiplicato per sé stessoincrementNumber- accetta un intero e lo restituisce incrementato di 1- Crea una funzione principale chiamata
processNumbersche accetta come parametri un elenco di interi e una funzione - La funzione
processNumbersdeve applicare la funzione specificata a ogni numero dell’elenco e restituire un nuovo elenco con i risultati - In base al tipo di operazione inserito, passa la funzione appropriata a
processNumbers - 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 successfullySe 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 successfullySe 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 successfullyIl 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');
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario7Funzioni avanzate
Funzioni anonimePassare funzioni come argomentiComprendere le closureIntroduzione alla ricorsioneFunzione ricorsiva: conto alla rovesciaFunzione ricorsiva: fattorialeRipasso - elaboratore di liste2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online