メインコンテンツにスキップ

ループ

このページでは、ループとサポートステートメントを使用してDartコードのフローを制御する方法を示します。

  • forループ
  • whileおよびdo whileループ
  • breakおよびcontinue

Dartでは、次を使用して制御フローを操作することもできます。

  • 分岐ifswitchなど)
  • 例外trycatchthrowなど)

forループ

#

標準のforループで反復処理できます。たとえば、

dart
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Dartのforループ内のクロージャは、インデックスのをキャプチャします。これにより、JavaScriptで見られる一般的な落とし穴を回避できます。たとえば、次を検討してください。

dart
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}

for (final c in callbacks) {
  c();
}

出力は、予想どおり、0、次に1です。対照的に、JavaScriptでは、この例は2、次に2を出力します。

ListSetなどのIterable型を反復処理するときに、現在の反復カウンターを知る必要がない場合があります。その場合は、for-inループを使用してコードをよりきれいにします。

dart
for (var candidate in candidates) {
  candidate.interview();
}

前の例のループでは、candidateはループ本体内で定義され、candidatesから一度に1つの値を参照するように設定されています。candidateはローカルの変数です。ループ本体内でcandidateを再割り当てしても、その反復のローカル変数のみが変更され、元のcandidatesイテラブルは変更されません。

イテラブルから取得した値を処理するために、for-inループでパターンを使用することもできます。

dart
for (final Candidate(:name, :yearsExperience) in candidates) {
  print('$name has $yearsExperience of experience.');
}

Iterableクラスには、別のオプションとしてforEach()メソッドもあります。

dart
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3

whileおよびdo-whileループ

#

whileループは、ループの前に条件を評価します。

dart
while (!isDone()) {
  doSomething();
}

do-whileループは、ループのに条件を評価します。

dart
do {
  printLine();
} while (!atEndOfPage());

breakとcontinue

#

ループを停止するにはbreakを使用します。

dart
while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

次のループ反復にスキップするにはcontinueを使用します。

dart
for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

リストやセットなどのIterableを使用している場合、前の例の記述方法が異なる場合があります。

dart
candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

ラベル

#

ラベルとは、ステートメントの前に配置してラベル付きステートメントを作成できる、コロン(labelName:)で区切られた識別子です。ループとswitchケースは、ラベル付きステートメントとしてよく使用されます。ラベル付きステートメントは、次のようにbreakまたはcontinueステートメントで後で参照できます。

  • break labelName;ラベル付きステートメントの実行を終了します。これは、ネストされたループ内にいるときに特定の外側のループを抜ける場合に便利です。

  • continue labelName;ラベル付きステートメントループの残りの現在の反復をスキップし、次の反復を続行します。

ラベルは、制御フローを管理するために使用されます。これらはループやswitchケースでよく使用され、デフォルトで最も内側のループに影響を与えるのではなく、どのステートメントを抜けるか、または続行するかを指定できます。

breakを使用したforループでのラベル

#

次のコードは、breakステートメントを使用したforループでouterLoopという名前のラベルの使用方法を示しています。

dart
outerLoop:
for (var i = 1; i <= 3; i++) {
  for (var j = 1; j <= 3; j++) {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
  }
}
print('outerLoop exited');

前の例では、i == 2およびj == 2の場合、break outerLoop;ステートメントは内側と外側の両方のループを停止します。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

continueを使用したforループでのラベル

#

次のコードは、continueステートメントを使用したforループでouterLoopという名前のラベルの使用方法を示しています。

dart
outerLoop:
for (var i = 1; i <= 3; i++) {
  for (var j = 1; j <= 3; j++) {
    if (i == 2 && j == 2) {
      continue outerLoop;
    }
    print('i = $i, j = $j');
  }
}

前の例では、i == 2およびj == 2の場合、continue outerLoop;i = 2の残りの反復をスキップし、i = 3に進みます。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

breakを使用したwhileループでのラベル

#

次のコードは、breakステートメントを使用したwhileループでouterLoopという名前のラベルの使用方法を示しています。

dart
var i = 1;

outerLoop:
while (i <= 3) {
  var j = 1;
  while (j <= 3) {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
    j++;
  }
  i++;
}
print('outerLoop exited');

前の例では、i == 2およびj == 2の場合、プログラムは内側と外側の両方のwhileループを抜けます。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

continueを使用したwhileループでのラベル

#

次のコードは、continueステートメントを使用したwhileループでouterLoopという名前のラベルの使用方法を示しています。

dart
var i = 1;

outerLoop:
while (i <= 3) {
  var j = 1;
  while (j <= 3) {
    if (i == 2 && j == 2) {
      i++;
      continue outerLoop;
    }
    print('i = $i, j = $j');
    j++;
  }
  i++;
}

前の例では、i = 2およびj = 2の反復がスキップされ、ループは直接i = 3に進みます。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

breakを使用したdo-whileループでのラベル

#

次のコードは、breakステートメントを使用したdo whileループでouterLoopという名前のラベルの使用方法を示しています。

dart
var i = 1;

outerLoop:
do {
  var j = 1;
  do {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
    j++;
  } while (j <= 3);
  i++;
} while (i <= 3);

print('outerLoop exited');

前の例では、i == 2およびj == 2の場合、プログラムは内側と外側の両方のループを抜けます。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

continueを使用したdo-whileループでのラベル

#

次のコードは、continueステートメントを使用したdo whileループでouterLoopという名前のラベルの使用方法を示しています。

dart
var i = 1;

outerLoop:
do {
  var j = 1;
  do {
    if (i == 2 && j == 2) {
      i++;
      continue outerLoop;
    }
    print('i = $i, j = $j');
    j++;
  } while (j <= 3);
  i++;
} while (i <= 3);

前の例では、ループはi = 2およびj = 2をスキップし、直接i = 3に進みます。その結果、出力は次のようになります。

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3