Ce face Function
În Dart, o funcție este un obiect ca oricare altul: o pui într-o variabilă, o trimiți ca argument (de exemplu lui map sau where) sau o returnezi din altă funcție. Toate funcțiile sunt de tipul Function.
Tipul simplu Function acceptă orice funcție, dar pierde informațiile despre parametri și rezultat; apelul nu mai este verificat la compilare. Preferă un tip de funcție exact, ca int Function(int, int) sau bool Function(String), eventual cu un typedef.
Poți folosi o metodă ca valoare fără să o apelezi („tear-off”): lista.forEach(print) sau texte.map(int.parse). Pentru a apela o funcție cu o listă de argumente construită dinamic există Function.apply.
Exemple
Exemplul 1: Funcții ca valori
int aduna(int a, int b) => a + b;
int inmulteste(int a, int b) => a * b;
int aplica(int Function(int, int) operatie, int x, int y) => operatie(x, y);
void main() {
var op = aduna;
print(op(2, 3));
print(aplica(inmulteste, 4, 5));
print(aplica((a, b) => a - b, 10, 4));
print(op.runtimeType);
['Iași', 'Cluj'].forEach(print);
print(['1', '22', '333'].map(int.parse).toList());
}
Rezultat
5
20
6
(int, int) => int
Iași
Cluj
[1, 22, 333]
Exemplul 2: O funcție care returnează funcții
double Function(double) reducere(int procent) => (pret) => pret * (100 - procent) / 100;
void main() {
var studenti = reducere(50);
var pensionari = reducere(30);
var oferte = <String, double Function(double)>{'studenți': studenti, 'pensionari': pensionari};
oferte.forEach((cine, calc) {
print('Bilet de 40 lei pentru $cine: ${calc(40)} lei');
});
}
Rezultat
Bilet de 40 lei pentru studenți: 20.0 lei
Bilet de 40 lei pentru pensionari: 28.0 lei
Greșeli frecvente
- Declari parametri de tip
Functionsimplu. Apelul nu mai este verificat: o funcție cu alți parametri dă eroare abia la rulare. Folosește tipul exact. - Scrii
lista.forEach(print())cu paranteze: apelezi funcția în loc să o trimiți. ScrieforEach(print).
Comenzi înrudite
Function.apply: Apelează o funcție cu argumente date ca listă (poziționale) și Map (numite), construite în timpul rulării.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.typedef: Dă un nume (alias) unui tip, de obicei unui tip de funcție sau unui tip generic lung.