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).