Function.apply în Dart

Apelează o funcție cu argumente date ca listă (poziționale) și Map (numite), construite în timpul rulării.

Sintaxă
static dynamic apply(Function function, List<dynamic>? positionalArguments,
    [Map<Symbol, dynamic>? namedArguments])

Ce face Function.apply

Function.apply(f, [a, b], {#nume: v}) este echivalent cu f(a, b, nume: v). Diferența este că lista și map-ul pot fi construite în timpul rulării, de exemplu dintr-o comandă scrisă de utilizator sau dintr-un fișier.

Argumentele numite se dau cu chei Symbol. Rezultatul este dynamic, iar verificarea parametrilor se face abia la rulare: un număr greșit de argumente aruncă NoSuchMethodError. Folosește-l doar când apelul chiar trebuie să fie dinamic; altfel apelează funcția direct.

Parametri

Parametru Descriere
function Funcția apelată.
positionalArguments Lista argumentelor poziționale (sau null).
namedArguments Argumentele numite, cu chei Symbol.

Ce returnează

Rezultatul funcției, ca dynamic.

Exemple

Exemplul 1: Apel cu argumente din listă

double pret(double baza, int bucati, {double tva = 0.19, double reducere = 0}) =>
    baza * bucati * (1 + tva) * (1 - reducere);

void main() {
  print(Function.apply(pret, [10.0, 3]));
  print(Function.apply(pret, [10.0, 3], {#reducere: 0.1}));
  print(Function.apply(pret, [10.0, 3], {#tva: 0.09, #reducere: 0.1}));
  try {
    Function.apply(pret, [10.0]);
  } on NoSuchMethodError {
    print('Lipsește un argument');
  }
}

Rezultat

35.699999999999996
32.129999999999995
29.430000000000003
Lipsește un argument

Exemplul 2: Un mic interpretor de comenzi

import 'dart:io';
import 'dart:math' as math;

final comenzi = <String, Function>{
  'aduna': (num a, num b) => a + b,
  'max': (num a, num b, num c) => math.max(a, math.max(b, c)),
  'putere': math.pow,
};

void main() {
  String? rand;
  while ((rand = stdin.readLineSync()) != null) {
    var parti = rand!.split(' ');
    var argumente = parti.skip(1).map(num.parse).toList();
    print('${parti[0]}$argumente = ${Function.apply(comenzi[parti[0]]!, argumente)}');
  }
}

Ce scrie utilizatorul (intrare)

aduna 4 5
max 3 9 2
putere 2 10

Rezultat

aduna[4, 5] = 9
max[3, 9, 2] = 9
putere[2, 10] = 1024

Greșeli frecvente

  • Dai argumentele numite cu chei text ({'tva': 0.09}): nu compilează. Cheile trebuie să fie simboluri: {#tva: 0.09}.

Comenzi înrudite

  • Function: Tipul comun al tuturor funcțiilor; în Dart funcțiile sunt valori care se pot pune în variabile și trimite ca argumente.
  • Symbol: Un nume de identificator (metodă, câmp, parametru) păstrat ca valoare; se scrie #nume.
  • Object.noSuchMethod: Metoda apelată când se cere unui obiect o metodă sau proprietate pe care nu o are (prin dynamic).