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 parametridynamicș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 deaplica(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.