Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Utwó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.

  1. Wczytaj ciąg znaków zawierający liczby oddzielone przecinkami (np. "1,2,3,4,5")
  2. Wczytaj ciąg znaków określający typ operacji ("double", "square" lub "increment")
  3. Podziel pierwsze wejście na listę ciągów znaków i przekonwertuj każdy z nich na liczbę całkowitą
  4. Utwórz trzy osobne funkcje:
    • doubleNumber — przyjmuje liczbę całkowitą i zwraca ją pomnożoną przez 2
    • squareNumber — przyjmuje liczbę całkowitą i zwraca ją pomnożoną przez samą siebie
    • incrementNumber — przyjmuje liczbę całkowitą i zwraca ją powiększoną o 1
  5. Utwórz główną funkcję o nazwie processNumbers, która przyjmuje listę liczb całkowitych i funkcję jako parametry
  6. Funkcja processNumbers powinna zastosować przekazaną funkcję do każdej liczby na liście i zwrócić nową listę z wynikami
  7. Na podstawie wejściowego typu operacji przekaż odpowiednią funkcję do processNumbers
  8. 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 successfully

Jeś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 successfully

Jeś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 successfully

Twó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');
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Dart online