Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea Colecțiilor în Dart

Ghid complet pentru Pattern Matching în Dart 3: utilizarea expresiilor switch ca valori, clauze de gardă (when), destructurarea automată a obiectelor, a listelor și a map-urilor cu verificare exhaustivă.

Sintaxă
return switch (response) { Success(:final data) => data, Error(:final code, :final msg) when code >= 500 => ... }

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)');
}
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea Colecțiilor

Ai o nelămurire despre utilizarea comenzii Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea Colecțiilor sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.