web-dev-qa-db-ja.com

関数から複数の値を返す

Go(または他の言語)でできるように、関数のreturnステートメント(オブジェクトを返す以外)でいくつかの値を返す方法はありますか?

たとえば、Goでは次のことができます。

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

これはDartで実行できますか?このようなもの:

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

Dartは複数の戻り値をサポートしていません。

配列を返すことができます、

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

または、値を入力する場合は、パッケージ https://pub.dartlang.org/packages/Tuple が提供するTupleクラスを使用します。

値またはエラーを返す方法については、 either も参照してください。

26

Goの複数の戻り値の主なユースケースの1つは、Dartが独自の方法で例外と失敗したプロミスを処理するエラー処理です。

もちろん、これには他のいくつかのユースケースが残っているため、明示的なタプルを使用した場合のコードの外観を見てみましょう。

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

それほど簡潔ではありませんが、簡潔で表現力豊かなコードです。私が一番気に入っているのは、簡単な実験プロジェクトが実際に開始され、機能を追加し始め、物事を維持するために構造を追加する必要がある場合、あまり変更する必要がないことです。

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

そのため、はい、Javaを大幅に改善するわけではありませんが、機能し、明確であり、UIの構築に適度に効率的です。そして、私は物事をすばやく一緒にハックし(仕事で休憩中にDartPadを開始することもあります)、プロジェクトが生きて成長することを知って後で構造を追加する方法が本当に好きです。

2