Przekazywanie funkcji jako argumentów
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 45 z 65.
W programowaniu funkcje mogą robić więcej niż tylko przyjmować proste wartości, takie jak liczby czy ciągi znaków — mogą także przyjmować inne funkcje jako parametry. Ta potężna koncepcja nazywa się funkcją wyższego rzędu i otwiera zupełnie nowe możliwości pisania elastycznego, wielokrotnego użytku kodu.
Gdy przekazujesz funkcję jako argument, zasadniczo dajesz innej funkcji możliwość zdecydowania, jaką operację wykonać. Pomyśl o tym jak o wręczeniu komuś narzędzia i pozwoleniu mu wybrać, jak użyć go do pracy z różnymi materiałami.
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}W tym przykładzie funkcja processNumbers przyjmuje listę i funkcję jako parametry. Parametr funkcji operation może być dowolną funkcją, która przyjmuje liczbę całkowitą. Oznacza to, że możesz przekazać funkcję, która wyświetla liczby, podwaja je lub wykonuje dowolną inną potrzebną operację.
To podejście sprawia, że Twój kod jest niezwykle elastyczny — zamiast pisać osobne funkcje dla każdej możliwej operacji, piszesz jedną funkcję, która może działać z wieloma różnymi operacjami, przyjmując je jako parametry.
Wyzwanie
ŁatwyUtwórz program, który demonstruje przekazywanie funkcji jako argumentów, budując elastyczny procesor liczb. Twój program utworzy różne funkcje przetwarzające i przekaże je do głównej funkcji przetwarzającej, która zastosuje operację do listy liczb.
- Wczytaj ciąg znaków zawierający liczby oddzielone przecinkami (np.
"1,2,3,4,5") - Wczytaj ciąg znaków określający typ operacji (
"double","square"lub"increment") - Podziel pierwsze wejście na listę ciągów znaków i przekonwertuj każdy z nich na liczbę całkowitą
- Utwórz trzy osobne funkcje:
doubleNumber— przyjmuje liczbę całkowitą i zwraca ją pomnożoną przez 2squareNumber— przyjmuje liczbę całkowitą i zwraca ją pomnożoną przez samą siebieincrementNumber— przyjmuje liczbę całkowitą i zwraca ją powiększoną o 1- Utwórz główną funkcję o nazwie
processNumbers, która przyjmuje listę liczb całkowitych i funkcję jako parametry - Funkcja
processNumberspowinna zastosować przekazaną funkcję do każdej liczby na liście i zwrócić nową listę z wynikami - Na podstawie wejściowego typu operacji przekaż odpowiednią funkcję do
processNumbers - Wyświetl wyniki dokładnie w formacie pokazanym poniżej
Na przykład, jeśli dane wejściowe to "2,4,6,8" i "double", twój program powinien wyświetlić:
Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfullyJeśli dane wejściowe to "3,5,7" i "square", twój program powinien wyświetlić:
Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfullyJeśli dane wejściowe to "10,20,30" i "increment", twój program powinien wyświetlić:
Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfullyTwój program musi demonstrować koncepcję funkcji wyższego rzędu, przekazując jedną z trzech funkcji operacji jako argument do funkcji processNumbers. Użyj instrukcji warunkowych, aby określić, którą funkcję przekazać na podstawie wejściowego typu operacji. Funkcja processNumbers powinna iterować przez listę wejściową, zastosować przekazaną funkcję do każdego elementu i zebrać wyniki w nowej liście.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Odczytaj dane wejściowe
String? numbersInput = stdin.readLineSync();
String? operation = stdin.readLineSync();
// Przekształć wejściowy ciąg znaków w listę liczb całkowitych
List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
// TODO: Utwórz trzy funkcje wykonujące operacje (doubleNumber, squareNumber, incrementNumber)
// TODO: Utwórz funkcję processNumbers, która przyjmuje listę i funkcję jako parametry
// TODO: Użyj instrukcji warunkowych, aby określić, którą funkcję przekazać w zależności od typu operacji
// TODO: Wywołaj processNumbers z odpowiednią funkcją i zapisz wynik
// Wyświetl wyniki w wymaganym formacie
print('Number Processor');
print('================');
print('Original numbers: $numbers');
print('Operation: $operation');
print('Processing numbers...');
// TODO: Wyświetl tutaj listę wyników
print('Operation completed successfully');
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego7Zaawansowane funkcje
Funkcje anonimowePrzekazywanie funkcji jako argumentówZrozumienie domknięćWprowadzenie do rekurencjiFunkcja rekurencyjna: odliczanieFunkcja rekurencyjna: silniaPowtórzenie – przetwarzanie listy2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online