funcții în Dart

Funcții Dart 1.0

Blocuri de cod cu nume, care primesc parametri și returnează o valoare; în Dart sunt și obiecte.

Sintaxă
TipReturnat nume(Tip parametru, ...) {
  ...
  return valoare;
}

Ce face funcții

O funcție are un tip returnat, un nume, o listă de parametri între paranteze și un corp între acolade. Funcțiile se pot declara la nivelul fișierului (de nivel superior), în clase (metode) sau chiar în alte funcții (funcții locale, vizibile doar acolo).

În Dart funcțiile sunt obiecte de tip Function: le poți pune în variabile, le poți trimite ca argumente și le poți returna. Tipul unei funcții se scrie int Function(int, int).

Tipurile parametrilor și al rezultatului se pot omite, dar atunci devin dynamic. Scrie-le mereu la funcțiile publice. Pentru corpuri de o singură expresie există forma scurtă =>.

Exemple

Exemplul 1: Funcție de nivel superior

Primește două numere și returnează media lor.

double media(int a, int b) {
  final suma = a + b;
  return suma / 2;
}

void main() {
  print('Media dintre 9 și 10: ${media(9, 10)}');
}

Rezultat

Media dintre 9 și 10: 9.5

Exemplul 2: Funcția trimisă ca argument

aplica primește o funcție și o folosește pe fiecare preț.

double cuTva(double pret) => pret * 1.19;
double cuReducere(double pret) => pret * 0.9;

List<double> aplica(List<double> preturi, double Function(double) transformare) {
  return [for (final p in preturi) transformare(p)];
}

void main() {
  final preturi = [100.0, 250.0];
  print(aplica(preturi, cuTva));
  print(aplica(preturi, cuReducere));
}

Rezultat

[119.0, 297.5]
[90.0, 225.0]

Exemplul 3: Funcție locală și recursivitate

factorial există doar în main și se apelează pe sine.

void main() {
  int factorial(int n) => n <= 1 ? 1 : n * factorial(n - 1);

  for (var i = 1; i <= 5; i++) {
    print('$i! = ${factorial(i)}');
  }
}

Rezultat

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120

Greșeli frecvente

  • Funcții fără tipuri: calcul(a, b) are parametri dynamic și pierzi verificarea analizorului.
  • Supraîncărcarea (două funcții cu același nume și parametri diferiți) nu există în Dart: folosește parametri opționali sau nume diferite.
  • aplica(preturi, cuTva()) în loc de aplica(preturi, cuTva): cu paranteze apelezi funcția în loc s-o trimiți.

Comenzi înrudite

  • parametri opționali și numiți: Parametrii între [ ] sunt poziționali opționali; cei între { } sunt numiți și se dau cu nume: valoare.
  • funcții săgeată (=>): Forma scurtă a unei funcții: => expresie înseamnă { return expresie; }.
  • funcții anonime: Funcții fără nume, scrise direct unde sunt folosite (lambda, closure); își amintesc variabilele din jur.
  • typedef: Dă un nume (alias) unui tip, de obicei unui tip de funcție sau unui tip generic lung.
  • return: Încheie funcția curentă și întoarce o valoare celui care a apelat-o.