Je sais que la classe Function peut être passée en paramètre à une autre fonction, comme ceci:
void doSomething(Function f) {
f(123);
}
Mais existe-t-il un moyen de contraindre les arguments et le type de retour du paramètre function?
Par exemple, dans ce cas, f
est invoqué directement sur un entier, mais que se passe-t-il s'il s'agit d'une fonction acceptant un type différent?
J'ai essayé de le passer en tant que Function<Integer>
, mais Function n'est pas un type paramétrique.
Existe-t-il un autre moyen de spécifier la signature de la fonction transmise en tant que paramètre?
Dart v1.23 a ajouté une nouvelle syntaxe pour l’écriture de types de fonctions qui fonctionne également en ligne.
void doSomething(Function(int) f) {
f(123);
}
Il présente l’avantage, par rapport à la syntaxe de paramètre de fonction, que vous pouvez également l’utiliser pour les variables ou partout où vous souhaitez écrire un type.
void doSomething(Function(int) f) {
Function(int) g = f;
g(123);
}
var x = new List<int Function(int)>[];
Edit: Notez que cette réponse contient des informations obsolètes. Voir Réponse d'Irn pour plus d'informations à jour.
Juste pour développer la réponse de Randal, votre code pourrait ressembler à quelque chose comme:
typedef void IntegerArgument(int x);
void doSomething(IntegerArgument f) {
f(123);
}
Function<int>
semble être une bonne idée, mais le problème est que nous pouvons vouloir spécifier le type de retour ainsi que le type d'un nombre arbitraire d'arguments.
Vous pouvez avoir un paramètre typé par la fonction ou utiliser une variable typedef
void main() {
doSomething(xToString);
doSomething2(xToString);
}
String xToString(int s) => 's';
typedef String XToStringFn(int s);
void doSomething(String f(int s)) {
print('value: ${f(123)}');
}
void doSomething2(XToStringFn f) {
print('value: ${f(123)}');
}
Pour référence.
int execute(int func(int a, int b)) => func(4, 3);
print(execute((a, b) => a + b));
Ceci est ce que typedefs sont pour!