Function în Dart

Tipul comun al tuturor funcțiilor; în Dart funcțiile sunt valori care se pot pune în variabile și trimite ca argumente.

Sintaxă
abstract final class Function
// tipuri de funcții: int Function(int, int), void Function(String)

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 Function simplu. 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. Scrie forEach(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.