web-dev-qa-db-fra.com

Passer une fonction typée en tant que paramètre dans Dart

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?

10
Raibaz

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)>[];
15
lrn

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.

9
Richard Ambler

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)}');
}

Exemple de DartPad

2
Günter Zöchbauer

Pour référence.

int execute(int func(int a, int b)) => func(4, 3);

print(execute((a, b) => a + b));
1
Jans

Ceci est ce que typedefs sont pour!

1
Randal Schwartz