web-dev-qa-db-fra.com

Qu'est-ce qu'un typedef 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 dois-je l'utiliser? Quel problème résout-il?

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

53
Gero

Un modèle d'utilisation courant de typedef dans Dart définit 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'exemple ci-dessus donne la sortie suivante:

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

La ligne typedef indique que LoggerOutputFunction prend un paramètre String et renvoie 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.

65
Cutch

Dart 1.24 introduit une nouvelle syntaxe typedef pour également prendre en charge les fonctions génériques. La syntaxe précédente est toujours prise en charge.

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 fonction 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

15
Günter Zöchbauer

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

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');
}
1
Ted Zhang
typedef LoggerOutputFunction = void Function(String msg);

cela semble beaucoup plus clair que la version précédente

0