Menu
Coddy logo textTech

Wzorce i dopasowywanie (3.0)

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 87 z 110.

W Dart 3 wprowadzono dopasowywanie wzorców — potężny sposób na rozpakowywanie i analizowanie danych w jednym wyrażeniu. Wzorce pozwalają wyodrębniać wartości z obiektów, sprawdzać ich strukturę i przypisywać wartości zmiennym — wszystko naraz.

Widziałeś już podstawowe destrukturyzowanie z użyciem rekordów. Wzorce rozszerzają tę funkcjonalność, umożliwiając pracę z obiektami, listami i mapami:

void main() {
  // Wzorce list
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // Wzorce map
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice ma 30 lat
}

Wzorce stają się szczególnie przydatne w wyrażeniach switch. Możesz jednocześnie dopasowywać typ, wartość i strukturę:

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));        // Liczba ujemna
  print(describe(42));        // Liczba dodatnia: 42
  print(describe([1, 2, 3])); // Lista zaczynająca się od 1
}

Klauzula when dodaje warunki do wzorców, a ... dopasowuje pozostałe elementy na liście. Podkreślenie _ działa jak symbol wieloznaczny, który dopasowuje wszystko. W połączeniu z klasami zapieczętowanymi wzorce umożliwiają wyczerpującą i bezpieczną pod względem typów obsługę złożonych struktur danych.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasyfikator danych, który wykorzystuje dopasowywanie wzorców do analizowania i kategoryzowania różnych typów danych wejściowych! Utworzysz system, który potrafi identyfikować i opisywać różne struktury danych za pomocą zaawansowanych funkcji dopasowywania wzorców w Dart 3.

Podzielisz swój kod na dwa pliki:

  • classifier.dart: Utwórz funkcję o nazwie classify, która przyjmuje parametr typu Object i zwraca opis typu String. Użyj wyrażenia switch z dopasowywaniem wzorców, aby obsłużyć następujące przypadki:
    • Pusta lista [] powinna zwracać Empty list
    • Lista zawierająca dokładnie jeden element typu integer powinna zwracać Single item: [value]
    • Lista zawierająca dokładnie dwa elementy powinna zwracać Pair: [first] and [second]
    • Lista zaczynająca się od elementu typu integer, po którym następują kolejne elementy, powinna zwracać List starting with [first], length: [total length] (użyj wzorca reszty ...)
    • Mapa zawierająca zarówno klucze 'name', jak i 'age' powinna zwracać [name] is [age] years old (użyj destrukturyzacji wzorca mapy)
    • Liczba całkowita, która jest ujemna (użyj klauzuli when), powinna zwracać Negative: [value]
    • Liczba całkowita równa zero powinna zwracać Zero
    • Każda inna liczba całkowita powinna zwracać Positive: [value]
    • Każda inna wartość powinna zwracać Unknown type
  • main.dart: Zaimportuj swój klasyfikator i zademonstruj dopasowywanie wzorców na różnych danych wejściowych. Wypisz wynik klasyfikacji każdej z poniższych wartości:
    • Pusta lista []
    • Lista z jednym elementem: [42]
    • Lista z dwoma elementami: ['hello', 'world']
    • Dłuższa lista: [1, 2, 3, 4, 5]
    • Mapa: {'name': 'Alice', 'age': 25}
    • Liczba całkowita -10
    • Liczba całkowita 0
    • Liczba całkowita 99

To wyzwanie łączy wzorce list, wzorce map, klauzulę when do sprawdzania warunków oraz wzorzec reszty (...) — wszystkie kluczowe funkcje dopasowywania wzorców z tej lekcji!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'classifier.dart';

void main() {
  // TODO: Użyj funkcji classify, aby sklasyfikować każdą wartość
  // i wypisz wyniki
  
  // Przetestuj na pustej liście
  print(classify([]));
  
  // TODO: Przetestuj na liście zawierającej jeden element: [42]
  
  // TODO: Przetestuj na liście zawierającej dwa elementy: ['hello', 'world']
  
  // TODO: Przetestuj na dłuższej liście: [1, 2, 3, 4, 5]
  
  // TODO: Przetestuj na mapie: {'name': 'Alice', 'age': 25}
  
  // TODO: Przetestuj na liczbie całkowitej -10
  
  // TODO: Przetestuj na liczbie całkowitej 0
  
  // TODO: Przetestuj na liczbie całkowitej 99
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online