Menu
Coddy logo textTech

Funktionen als Argumente übergeben

Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 45 von 65.

In der Programmierung können Funktionen mehr tun, als nur einfache Werte wie Zahlen oder Strings zu akzeptieren – sie können auch andere Funktionen als Parameter akzeptieren. Dieses leistungsstarke Konzept wird als Funktion höherer Ordnung bezeichnet und eröffnet völlig neue Wege, flexiblen und wiederverwendbaren Code zu schreiben.

Wenn Sie eine Funktion als Argument übergeben, geben Sie einer anderen Funktion im Wesentlichen die Möglichkeit, zu entscheiden, welche Operation ausgeführt werden soll. Stellen Sie es sich so vor, als würden Sie jemandem ein Werkzeug geben und ihn entscheiden lassen, wie er es auf verschiedenen Materialien einsetzt.

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

In diesem Beispiel nimmt processNumbers eine Liste und eine Funktion als Parameter entgegen. Der Funktionsparameter operation kann jede Funktion sein, die eine Ganzzahl akzeptiert. Das bedeutet, dass Sie eine Funktion übergeben könnten, die Zahlen ausgibt, sie verdoppelt oder jede andere von Ihnen benötigte Operation ausführt.

Dieser Ansatz macht Ihren Code unglaublich flexibel – anstatt separate Funktionen für jede mögliche Operation zu schreiben, schreiben Sie eine Funktion, die mit vielen verschiedenen Operationen arbeiten kann, indem sie diese als Parameter akzeptiert.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein Programm, das die Übergabe von Funktionen als Argumente demonstriert, indem Sie einen flexiblen Zahlenprozessor erstellen. Ihr Programm wird verschiedene Verarbeitungsfunktionen erstellen und diese an eine Hauptprozessorfunktion übergeben, die die Operation auf eine Liste von Zahlen anwendet.

  1. Lesen Sie eine String-Eingabe ein, die durch Kommas getrennte Zahlen enthält (z. B. "1,2,3,4,5")
  2. Lesen Sie eine String-Eingabe ein, die den Operationstyp darstellt ("double", "square" oder "increment")
  3. Teilen Sie die erste Eingabe in eine Liste von Strings auf und konvertieren Sie jeden in eine Ganzzahl
  4. Erstellen Sie drei separate Funktionen:
    • doubleNumber - nimmt eine Ganzzahl entgegen und gibt sie mit 2 multipliziert zurück
    • squareNumber - nimmt eine Ganzzahl entgegen und gibt sie mit sich selbst multipliziert zurück
    • incrementNumber - nimmt eine Ganzzahl entgegen und gibt sie plus 1 zurück
  5. Erstellen Sie eine Hauptfunktion namens processNumbers, die eine Liste von Ganzzahlen und eine Funktion als Parameter entgegennimmt
  6. Die Funktion processNumbers sollte die übergebene Funktion auf jede Zahl in der Liste anwenden und eine neue Liste mit den Ergebnissen zurückgeben
  7. Übergeben Sie basierend auf der Eingabe des Operationstyps die entsprechende Funktion an processNumbers
  8. Zeigen Sie die Ergebnisse in dem unten gezeigten exakten Format an

Wenn die Eingaben beispielsweise "2,4,6,8" und "double" sind, sollte Ihr Programm Folgendes ausgeben:

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

Wenn die Eingaben "3,5,7" und "square" sind, sollte Ihr Programm Folgendes ausgeben:

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

Wenn die Eingaben "10,20,30" und "increment" sind, sollte Ihr Programm Folgendes ausgeben:

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

Ihr Programm muss das Konzept von Funktionen höherer Ordnung demonstrieren, indem es eine der drei Operationsfunktionen als Argument an die Funktion processNumbers übergibt. Verwenden Sie bedingte Anweisungen, um basierend auf der Eingabe des Operationstyps zu bestimmen, welche Funktion übergeben werden soll. Die Funktion processNumbers sollte die Eingabeliste durchlaufen, die übergebene Funktion auf jedes Element anwenden und die Ergebnisse in einer neuen Liste sammeln.

Spickzettel

Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Parameter akzeptieren können, was flexiblen und wiederverwendbaren Code ermöglicht.

Um eine Funktion als Argument zu übergeben, definieren Sie einen Parameter vom Typ Function:

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

Dies ermöglicht es Ihnen, verschiedene Funktionen zu übergeben, um unterschiedliche Operationen auf denselben Daten auszuführen, wodurch Ihr Code modularer wird und die Notwendigkeit entfällt, separate Funktionen für jede mögliche Operation zu schreiben.

Probier es selbst

import 'dart:io';

void main() {
  // Eingabe lesen
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // String-Eingabe in eine Liste von Ganzzahlen umwandeln
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: Erstelle die drei Operationsfunktionen (doubleNumber, squareNumber, incrementNumber)
  
  // TODO: Erstelle die Funktion processNumbers, die eine Liste und eine Funktion als Parameter entgegennimmt
  
  // TODO: Verwende bedingte Anweisungen, um zu bestimmen, welche Funktion basierend auf dem Operationstyp übergeben werden soll
  
  // TODO: Rufe processNumbers mit der entsprechenden Funktion auf und speichere das Ergebnis
  
  // Die Ergebnisse im erforderlichen Format ausgeben
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: Gib die Ergebnisliste hier aus
  print('Operation completed successfully');
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf