Pattern e matching (3.0)
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 87 di 110.
Dart 3 ha introdotto il pattern matching, un potente modo per destrutturare e ispezionare i dati in una singola espressione. I pattern ti permettono di estrarre valori dagli oggetti, verificarne la struttura e associare variabili, tutto in una volta.
Hai già visto il destructuring di base con i record. I pattern estendono questa funzionalità agli oggetti, alle liste e alle mappe:
void main() {
// Pattern di lista
var numbers = [1, 2, 3];
var [a, b, c] = numbers;
print('$a, $b, $c'); // 1, 2, 3
// Pattern di mappa
var user = {'name': 'Alice', 'age': 30};
var {'name': name, 'age': age} = user;
print('$name is $age'); // Alice is 30
}I pattern diventano particolarmente potenti nelle espressioni switch. Puoi eseguire corrispondenze simultanee su tipo, valore e struttura:
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 number
print(describe(42)); // Positive number: 42
print(describe([1, 2, 3])); // List starting with 1
}La clausola when aggiunge condizioni ai pattern, e ... corrisponde agli elementi rimanenti in una lista. Il trattino basso _ funge da carattere jolly che corrisponde a qualsiasi cosa. Insieme alle classi sealed, i pattern consentono una gestione esaustiva e sicura rispetto ai tipi di strutture dati complesse.
Sfida
FacileCreiamo un classificatore di dati che usa il pattern matching per analizzare e categorizzare diversi tipi di input! Creerai un sistema in grado di identificare e descrivere varie strutture di dati usando le potenti funzionalità di pattern matching di Dart 3.
Organizzerai il codice in due file:
classifier.dart: Crea una funzione chiamataclassifyche accetta un parametroObjecte restituisce una descrizioneString. Usa un'espressione switch con il pattern matching per gestire questi casi:- Una lista vuota
[]dovrebbe restituireEmpty list - Una lista con esattamente un elemento intero dovrebbe restituire
Single item: [value] - Una lista con esattamente due elementi dovrebbe restituire
Pair: [first] and [second] - Una lista che inizia con un intero seguito da altri elementi dovrebbe restituire
List starting with [first], length: [total length](usa il pattern rest...) - Una mappa contenente sia le chiavi
'name'che'age'dovrebbe restituire[name] is [age] years old(usa il destructuring del pattern per le mappe) - Un intero negativo (usa la clausola
when) dovrebbe restituireNegative: [value] - Un intero uguale a zero dovrebbe restituire
Zero - Qualsiasi altro intero dovrebbe restituire
Positive: [value] - Qualsiasi altro valore dovrebbe restituire
Unknown type
- Una lista vuota
main.dart: Importa il tuo classificatore e mostra il pattern matching con vari input. Stampa il risultato della classificazione di ciascuno di questi valori:- Una lista vuota
[] - Una lista con un elemento:
[42] - Una lista con due elementi:
['hello', 'world'] - Una lista più lunga:
[1, 2, 3, 4, 5] - Una mappa:
{'name': 'Alice', 'age': 25} - L'intero
-10 - L'intero
0 - L'intero
99
- Una lista vuota
Questa sfida combina i pattern per le liste, i pattern per le mappe, la clausola when per le guardie e il pattern rest (...): tutte le principali funzionalità di pattern matching della lezione!
Output previsto:
Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99Provalo tu
import 'classifier.dart';
void main() {
// TODO: Usa la funzione classify per classificare ogni valore
// e stampa i risultati
// Prova con una lista vuota
print(classify([]));
// TODO: Prova con una lista contenente un elemento: [42]
// TODO: Prova con una lista contenente due elementi: ['hello', 'world']
// TODO: Prova con una lista più lunga: [1, 2, 3, 4, 5]
// TODO: Prova con una mappa: {'name': 'Alice', 'age': 25}
// TODO: Prova con l'intero -10
// TODO: Prova con l'intero 0
// TODO: Prova con l'intero 99
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online