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.
Wyzwanie
ŁatwyZbudujmy 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 nazwieclassify, która przyjmuje parametr typuObjecti zwraca opis typuString. 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
- Pusta lista
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
- Pusta lista
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: 99Spró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
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online