Lansat în Dart 3.0, sistemul de Pattern Matching reprezintă una dintre cele mai mari evoluții ale limbajului. El permite inspectarea structurii datelor, verificarea tipurilor, filtrarea pe baza unor condiții suplimentare (guard clauses) și extragerea valorilor componente (destructuring) într-o singură instrucțiune elegantă.
În Dart 3, instrucțiunea switch a devenit și o expresie (Switch Expression), ceea ce înseamnă că poate returna direct o valoare și este verificată exhaustiv de către compilator.
Comparație: Parsare Tradițională Imperativă vs Pattern Matching Dart 3
// ❌ ABORDARE CLASICĂ: Verificări repetitive de tip, cast forțat și if-uri imbricate
String describeResponseOld(dynamic response) {
if (response is Map) {
if (response.containsKey('error')) {
final code = response['error']['code'] as int;
final msg = response['error']['message'] as String;
return 'Eroare HTTP $code: $msg';
} else if (response.containsKey('data')) {
return 'Succes: ${response['data']}';
}
}
return 'Răspuns necunoscut';
}
// CORECT & IDIOMATIC ÎN DART 3: Switch Expression cu Destructurare de Map
String describeResponse(dynamic response) => switch (response) {
{'error': {'code': int code, 'message': String msg}} when code >= 500 =>
'Eroare critică de server ($code): $msg',
{'error': {'code': int code, 'message': String msg}} =>
'Eroare client ($code): $msg',
{'data': var data} => 'Date recepționate cu succes: $data',
_ => 'Format de răspuns nerecunoscut'
};
Tipuri Principale de Tipare (Patterns) Suportate în Dart 3
| Tip de Pattern | Sintaxă Exemplu | Descriere Tehnică |
|---|---|---|
| Pattern de Obiect | User(:final name, :final age) |
Extrage proprietățile name și age direct din instanța clasei User. |
| Pattern de Listă | [var first, var second, ...var rest] |
Extrage primele două elemente și restul listei folosind operatorul rest (...). |
| Pattern Relațional | >= 0 && <= 100 |
Validează dacă valoarea se încadrează într-un interval fără a repeta variabila. |
| Clauză de Gardă | case Pattern when conditie |
Aplică potrivirea doar dacă expresia booleană din when este adevărată. |
Destructurare Directă în Declarații de Variabile
void main() {
// Destructurarea unei liste cu rest:
final [head, second, ...tail] = [10, 20, 30, 40, 50];
print('Primul: $head, Al doilea: $second, Restul: $tail');
// Afișează: Primul: 10, Al doilea: 20, Restul: [30, 40, 50]
// Destructurarea unui Record:
final (title, :author, :pages) = ('Ghid Dart', author: 'Dexter', pages: 350);
print('Carte: $title de $author ($pages pagini)');
}