funcții săgeată (=>) în Dart

Funcții Dart 1.0

Forma scurtă a unei funcții: => expresie înseamnă { return expresie; }.

Sintaxă
Tip nume(parametri) => expresie;
(x) => x * 2           // funcție anonimă
Tip get nume => expresie;

Ce face funcții săgeată (=>)

=> expresie este prescurtarea pentru { return expresie; }. Se folosește la funcții, metode, getteri și funcții anonime al căror corp este o singură expresie.

După => poate sta doar o expresie, nu instrucțiuni: nu poți pune if, for sau mai multe rânduri cu ;. Poți însă folosi operatorul ternar, o expresie switch, ?? sau throw.

Dacă funcția este void, => doar execută expresia: void salut() => print('Salut');.

Exemple

Exemplul 1: Funcții de o singură expresie

Fiecare funcție returnează direct rezultatul expresiei de după =>.

double ariaCerc(double r) => 3.14159 * r * r;
bool estePar(int n) => n % 2 == 0;
String initiale(String prenume, String nume) => '${prenume[0]}.${nume[0]}.';

void main() {
  print(ariaCerc(2));
  print(estePar(7));
  print(initiale('Andrei', 'Mureșan'));
}

Rezultat

12.56636
false
A.M.

Exemplul 2: Getteri și metode cu =>

Forma scurtă este foarte des folosită în clase.

class Dreptunghi {
  final double latime, inaltime;
  Dreptunghi(this.latime, this.inaltime);

  double get arie => latime * inaltime;
  bool get estePatrat => latime == inaltime;
  @override
  String toString() => 'Dreptunghi $latime x $inaltime';
}

void main() {
  final d = Dreptunghi(4, 4);
  print('$d: arie ${d.arie}, pătrat: ${d.estePatrat}');
}

Rezultat

Dreptunghi 4.0 x 4.0: arie 16.0, pătrat: true

Exemplul 3: Cu expresie switch

Chiar dacă logica are mai multe cazuri, rămâne o singură expresie.

String ziua(int n) => switch (n) {
      1 => 'luni',
      2 => 'marți',
      3 => 'miercuri',
      4 => 'joi',
      5 => 'vineri',
      6 || 7 => 'weekend',
      _ => throw RangeError.range(n, 1, 7),
    };

void main() {
  print([1, 3, 6].map(ziua).join(', '));
}

Rezultat

luni, miercuri, weekend

Greșeli frecvente

  • Instrucțiuni după =>: => if (x) ... nu compilează. Folosește corp cu acolade.
  • => { ... }: nu este un bloc, ci un literal de Set sau Map! Alege fie =>, fie { }.
  • Expresii foarte lungi după =>: devin greu de citit; corpul cu acolade este mai clar.

Comenzi înrudite

  • funcții: Blocuri de cod cu nume, care primesc parametri și returnează o valoare; în Dart sunt și obiecte.
  • funcții anonime: Funcții fără nume, scrise direct unde sunt folosite (lambda, closure); își amintesc variabilele din jur.
  • get și set: Proprietăți calculate (get) și proprietăți cu validare la atribuire (set), folosite ca niște câmpuri.