Record în Dart

Clasa comună tuturor record-urilor: grupuri anonime, imutabile, de valori, comparate după conținut.

Sintaxă
abstract final class Record
// valori: (1, 'Ana'), (x: 1, y: 2), ('Iași', cod: 700506)
// tipuri: (int, String), ({int x, int y})

Ce face Record

Un record grupează câteva valori fără să definești o clasă: ('Ana', 21) sau (nume: 'Ana', varsta: 21). Câmpurile poziționale se citesc cu $1, $2…, iar cele numite după nume (r.nume). Toate record-urile sunt de tipul Record, iar tipul exact arată ca (String, int).

Record-urile sunt imutabile și se compară după conținut: două record-uri cu aceeași formă și aceleași valori sunt egale (==) și au același hashCode. Sunt ideale pentru a returna mai multe valori dintr-o funcție și pentru chei compuse în Map.

Le desfaci ușor cu pattern-uri: var (nume, varsta) = persoana;. Sintaxa completă și regulile de tip sunt explicate pe pagina records.

Exemple

Exemplul 1: Record-uri și tipul Record

void main() {
  var elev = ('Ana', 9.5);
  var punct = (x: 3, y: 4);
  print(elev);
  print(elev.$1);
  print(punct.y);
  print(punct.runtimeType);
  print((1, 'a') == (1, 'a'));
  print((x: 1, y: 2) == (y: 2, x: 1));
  print({(1, 2): 'colț'}[(1, 2)]);
}

Rezultat

(Ana, 9.5)
Ana
4
({int x, int y})
true
true
colț

Exemplul 2: Mai multe valori returnate dintr-o funcție

(double medie, int minim, int maxim) statistici(List<int> note) {
  var suma = note.reduce((a, b) => a + b);
  var sortate = [...note]..sort();
  return (suma / note.length, sortate.first, sortate.last);
}

void main() {
  var (medie, minim, maxim) = statistici([9, 7, 10, 8, 6]);
  print('Media ${medie.toStringAsFixed(2)}, minim $minim, maxim $maxim');
  var rezultat = statistici([5, 5]);
  print(rezultat);
}

Rezultat

Media 8.00, minim 6, maxim 10
(5.0, 5, 5)

Greșeli frecvente

  • Încerci să modifici un câmp: elev.$1 = 'Ion' nu compilează. Record-urile sunt imutabile; creează unul nou.
  • Numeri câmpurile de la 0. Primul câmp pozițional este $1.

Comenzi înrudite

  • records: Grupuri de valori anonime și imutabile, de forma (a, b) sau (nume: a), ideale pentru a întoarce mai multe valori.
  • pattern-uri (destructurare): Desfac o valoare (record, listă, map, obiect) în variabile separate, într-o singură declarație.
  • Object.hashCode: Un număr asociat obiectului, folosit de Set și Map; obiectele egale cu == trebuie să aibă același hashCode.