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)');
}
Întrebări & Exemple de Cod:
Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea ColecțiilorAi o nelămurire despre utilizarea comenzii
Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea Colecțiilorsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.