Menu
Coddy logo textTech

Muster & Matching (3.0)

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 87 von 110.

In Dart 3 wurde Pattern Matching eingeführt, eine leistungsstarke Möglichkeit, Daten in einem einzigen Ausdruck zu destrukturieren und zu untersuchen. Mit Patterns kannst du Werte aus Objekten extrahieren, ihre Struktur überprüfen und Variablen binden – alles auf einmal.

Du hast bereits die grundlegende Destrukturierung mit Records gesehen. Muster erweitern dies, sodass sie mit Objekten, Listen und Maps funktionieren:

void main() {
  // Listenmuster
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // Map-Muster
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice ist 30
}

Pattern werden in switch-Ausdrücken besonders leistungsfähig. Du kannst gleichzeitig nach Typ, Wert und Struktur abgleichen:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // Negative Zahl
  print(describe(42));        // Positive Zahl: 42
  print(describe([1, 2, 3])); // List starting with 1
}

Die when-Klausel fügt Mustern Bedingungen hinzu, und ... passt auf die verbleibenden Elemente in einer Liste. Der Unterstrich _ fungiert als Platzhalter, der auf alles passt. In Kombination mit versiegelten Klassen ermöglichen Muster eine vollständige, typsichere Verarbeitung komplexer Datenstrukturen.

challenge icon

Aufgabe

Einfach

Erstellen wir einen Datenklassifizierer, der Musterabgleich verwendet, um verschiedene Arten von Eingaben zu analysieren und zu kategorisieren! Du erstellst ein System, das verschiedene Datenstrukturen mithilfe der leistungsstarken Musterabgleich-Funktionen von Dart 3 erkennen und beschreiben kann.

Du organisierst deinen Code in zwei Dateien:

  • classifier.dart: Erstelle eine Funktion namens classify, die einen Object-Parameter übernimmt und eine String-Beschreibung zurückgibt. Verwende einen switch-Ausdruck mit Musterabgleich, um diese Fälle zu behandeln:
    • Eine leere Liste [] soll Empty list zurückgeben
    • Eine Liste mit genau einem ganzzahligen Element soll Single item: [value] zurückgeben
    • Eine Liste mit genau zwei Elementen soll Pair: [first] and [second] zurückgeben
    • Eine Liste, die mit einer Ganzzahl beginnt und von weiteren Elementen gefolgt wird, soll List starting with [first], length: [total length] zurückgeben (verwende das Restmuster ...)
    • Eine Map, die sowohl die Schlüssel 'name' als auch 'age' enthält, soll [name] is [age] years old zurückgeben (verwende die Destrukturierung mit Map-Mustern)
    • Eine negative Ganzzahl (verwende die when-Klausel) soll Negative: [value] zurückgeben
    • Eine Ganzzahl, die null ist, soll Zero zurückgeben
    • Jede andere Ganzzahl soll Positive: [value] zurückgeben
    • Jeder andere Wert soll Unknown type zurückgeben
  • main.dart: Importiere deinen Klassifizierer und demonstriere den Musterabgleich mit verschiedenen Eingaben. Gib das Ergebnis der Klassifizierung jedes dieser Werte aus:
    • Eine leere Liste []
    • Eine Liste mit einem Element: [42]
    • Eine Liste mit zwei Elementen: ['hello', 'world']
    • Eine längere Liste: [1, 2, 3, 4, 5]
    • Eine Map: {'name': 'Alice', 'age': 25}
    • Die Ganzzahl -10
    • Die Ganzzahl 0
    • Die Ganzzahl 99

Diese Herausforderung kombiniert Listenmuster, Map-Muster, die when-Klausel für Bedingungen und das Restmuster (...) – alle wichtigen Musterabgleich-Funktionen aus der Lektion!

Erwartete Ausgabe:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

Probier es selbst

import 'classifier.dart';

void main() {
  // TODO: Verwende die classify-Funktion, um jeden Wert zu kategorisieren
  // und gib die Ergebnisse aus
  
  // Teste mit einer leeren Liste
  print(classify([]));
  
  // TODO: Teste mit einer Liste, die ein Element enthält: [42]
  
  // TODO: Teste mit einer Liste, die zwei Elemente enthält: ['hello', 'world']
  
  // TODO: Teste mit einer längeren Liste: [1, 2, 3, 4, 5]
  
  // TODO: Teste mit einer Map: {'name': 'Alice', 'age': 25}
  
  // TODO: Teste mit der Ganzzahl -10
  
  // TODO: Teste mit der Ganzzahl 0
  
  // TODO: Teste mit der Ganzzahl 99
}
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 Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler