98 votes

Que sont les typedefs de fonction / alias de type de fonction dans Dart ?

J'ai lu la description, et je comprends qu'il s'agit d'un alias de type fonction.

Mais comment l'utiliser ? Pourquoi déclarer des champs avec un type de fonction ? Quand l'utiliser ? Quel problème cela résout-il ?

Je pense que j'ai besoin d'un ou deux exemples de code réel.

120voto

Cutch Points 3263

Une utilisation courante du typedef dans Dart consiste à définir une interface de rappel. Par exemple :

typedef void LoggerOutputFunction(String msg);

class Logger {
  LoggerOutputFunction out;
  Logger() {
    out = print;
  }
  void log(String msg) {
    out(msg);
  }
}

void timestampLoggerOutputFunction(String msg) {
  String timeStamp = new Date.now().toString();
  print('${timeStamp}: $msg');
}

void main() {
  Logger l = new Logger();
  l.log('Hello World');
  l.out = timestampLoggerOutputFunction;
  l.log('Hello World');
}

L'exécution de l'échantillon ci-dessus donne le résultat suivant :

Bonjour le monde
2012-09-22 10:19:15.139 : Bonjour le monde.

La ligne typedef indique que LoggerOutputFunction prend un paramètre String et retourne void.

timestampLoggerOutputFunction correspond à cette définition et peut donc être affecté au champ out.

Faites-moi savoir si vous avez besoin d'un autre exemple.

32voto

Günter Zöchbauer Points 21340

Dart 1.24 introduit une nouvelle syntaxe typedef pour supporter également les fonctions génériques. La syntaxe précédente est toujours supportée.

typedef F = List<T> Function<T>(T);

Pour plus de détails, voir https://github.com/dart-lang/sdk/blob/master/docs/language/informal/generic-function-type-alias.md

Les types de fonctions peuvent également être spécifiés en ligne

void foo<T, S>(T Function(int, S) aFunction) {...}

Voir aussi https://www.dartlang.org/guides/language/language-tour#typedefs

28voto

typedef LoggerOutputFunction = void Function(String msg);

cette version semble beaucoup plus claire que la précédente

11voto

Ted Zhang Points 11

Juste une réponse légèrement modifiée, selon la dernière syntaxe typedef, l'exemple pourrait être mis à jour pour devenir :

typedef LoggerOutputFunction = void Function(String msg);

class Logger {
  LoggerOutputFunction out;
  Logger() {
    out = print;
  }
  void log(String msg) {
    out(msg);
  }
}

void timestampLoggerOutputFunction(String msg) {
  String timeStamp = new Date.now().toString();
  print('${timeStamp}: $msg');
}

void main() {
  Logger l = new Logger();
  l.log('Hello World');
  l.out = timestampLoggerOutputFunction;
  l.log('Hello World');
}

7voto

jitesh mohite Points 3119

Typedef dans Dart est utilisé pour créer une fonction définie par l'utilisateur (alias) pour d'autres fonctions d'application,

Syntax: typedef function_name (parameters);

À l'aide d'un typedef, nous pouvons également affecter une variable à une fonction.

Syntax:typedef variable_name = function_name;

Après avoir assigné la variable, si nous devons l'invoquer alors nous faisons comme :

Syntax: variable_name(parameters);

Exemple :

// Defining alias name
typedef MainFunction(int a, int b);

functionOne(int a, int b) {
  print("This is FunctionOne");
  print("$a and $b are lucky numbers !!");
}

functionTwo(int a, int b) {
  print("This is FunctionTwo");
  print("$a + $b is equal to ${a + b}.");
}

// Main Function
void main() {
  // use alias
  MainFunction number = functionOne;

  number(1, 2);

  number = functionTwo;
 // Calling number
  number(3, 4);
}

Sortie :

This is FunctionOne
1 and 2 are lucky numbers !!
This is FunctionTwo
3 + 4 is equal to 7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X