web-dev-qa-db-fra.com

Renvoie plusieurs valeurs de la fonction

Existe-t-il un moyen de renvoyer plusieurs valeurs dans une instruction return (autre qu'un retour d'objet), comme nous pouvons le faire avec Go (ou d'autres langages)?

Par exemple, dans Go on peut faire:

func vals() (int, int) {
    return 3, 7
}

Cela peut-il être fait en Dart? Quelque chose comme ça:

int, String foo() {
    return 42, "foobar";
} 
13
Alexi Coard

Dart ne supporte pas les valeurs de retour multiples.

Vous pouvez retourner un tableau, 

List foo() {
  return [42, "foobar"];
}

ou si vous voulez que les valeurs soient typées, utilisez une classe Tuple comme le paquet https://pub.dartlang.org/packages/Tuple fournit.

Voir aussi either pour savoir comment renvoyer une valeur ou une erreur.

17
Günter Zöchbauer

J'aimerais ajouter que l'un des principaux cas d'utilisation de plusieurs valeurs de retour dans Go est la gestion des erreurs que Dart gère à sa manière, avec des exceptions et des promesses non tenues. 

Bien sûr, cela laisse quelques autres cas d'utilisation, voyons donc à quoi ressemble le code lors de l'utilisation de n-uplets explicites:

import 'package:Tuple/tuple.Dart';

Tuple2<int, String> demo() {
  return new Tuple2(42, "life is good");
}

void main() {
  final result = demo();
  if (result.item1 > 20) {
    print(result.item2);
  }
}

Pas aussi concis, mais c'est un code propre et expressif. Ce que j'aime le plus, c'est qu'il n'a pas besoin de beaucoup changer une fois que votre projet expérimental rapide a vraiment démarré et que vous commencez à ajouter des fonctionnalités et que vous devez ajouter plus de structure pour rester au fait des choses.

class FormatResult {
  bool changed;
  String result;
  FormatResult(this.changed, this.result);
}

FormatResult powerFormatter(String text) {
  bool changed = false;
  String result = text;
  // secret implementation magic
  // ...
  return new FormatResult(changed, result);
}

void main() {
  String draftCode = "print('Hello World.');";
  final reformatted = powerFormatter(draftCode);
  if (reformatted.changed) {
    // some expensive operation involving servers in the cloud.
  }
}

Donc, oui, ce n'est pas vraiment une amélioration par rapport à Java, mais cela fonctionne, il est clair et raisonnablement efficace pour la création d'interfaces utilisateur. Et j'aime beaucoup la façon dont je peux rapidement pirater des choses (parfois en démarrant sur DartPad pendant une pause au travail), puis en ajoutant une structure plus tard, quand je sais que le projet vivra et se développerait.

0
Robert Jack Will