webentwicklung-frage-antwort-db.com.de

Gibt mehrere Werte aus der Funktion zurück

Gibt es eine Möglichkeit, mehrere Werte in einer Funktionsrückgabeanweisung zurückzugeben (abgesehen von der Rückgabe eines Objekts), wie in Go (oder in anderen Sprachen) möglich ist?

In Go können wir beispielsweise Folgendes tun:

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

Kann das in Dart gemacht werden? Etwas wie das:

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

Dart unterstützt nicht mehrere Rückgabewerte.

Sie können ein Array zurückgeben, 

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

oder wenn Sie möchten, dass die Werte eingegeben werden, verwenden Sie eine Tuple-Klasse, wie das Paket https://pub.dartlang.org/packages/Tuple .

Siehe auch either , um einen Wert oder einen Fehler zurückzugeben.

17

Ich möchte hinzufügen, dass einer der Hauptanwendungsfälle für mehrere Rückgabewerte in Go die Fehlerbehandlung ist, die Dart auf seine eigene Weise mit Exceptions und fehlgeschlagenen Versprechen behandelt. 

Natürlich bleiben einige andere Anwendungsfälle übrig. Sehen wir uns also an, wie der Code bei Verwendung expliziter Tupel aussieht:

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

Nicht ganz so prägnant, aber es ist sauberer und ausdrucksvoller Code. Was mir am meisten gefällt, ist, dass es nicht viel ändern muss, wenn Ihr schnelles experimentelles Projekt wirklich abhebt und Sie Funktionen hinzufügen und mehr Struktur hinzufügen müssen, um den Überblick zu behalten.

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.
  }
}

Ja, es ist keine große Verbesserung gegenüber Java, aber es funktioniert, es ist klar und für den Aufbau von UIs einigermaßen effizient. Und ich mag es wirklich, wie ich schnell Dinge zusammen hacken kann (manchmal ab einer Arbeitspause von DartPad ausgehend) und später Struktur hinzufüge, wenn ich weiß, dass das Projekt weiterleben und wachsen wird.

0