跳到主要內容

迴圈

本頁面展示瞭如何使用迴圈和相關語句來控制 Dart 程式碼的流程。

  • for 迴圈
  • whiledo while 迴圈
  • breakcontinue

您還可以使用以下方式在 Dart 中操縱控制流:

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

有時,當迭代 Iterable 型別(例如 ListSet)時,您可能不需要知道當前的迭代計數器。在這種情況下,使用 for-in 迴圈可以使程式碼更簡潔:

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

在前面的示例迴圈中,candidate 在迴圈體中定義,並被設定為一次引用 candidates 中的一個值。candidate 是一個區域性變數。在迴圈體內部重新分配 candidate 只會更改該迭代的區域性變數,而不會修改原始的 candidates 可迭代物件。

要處理從可迭代物件獲得的值,您還可以在 for-in 迴圈中使用模式

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

可迭代類還具有 forEach() 方法作為另一種選擇:

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

whiledo-while 迴圈

#

while 迴圈在迴圈之前評估條件:

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

do-while 迴圈在迴圈之後評估條件:

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

breakcontinue

#

使用 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 情況常被用作帶標籤的語句。帶標籤的語句可以在 breakcontinue 語句中引用,如下所示:

  • break labelName; 終止帶標籤語句的執行。當您位於巢狀迴圈中時,這對於跳出特定的外部迴圈很有用。

  • continue labelName; 跳過帶標籤語句迴圈當前迭代的其餘部分,並繼續進行下一次迭代。

標籤用於管理控制流。它們常與迴圈和 switch 情況一起使用,允許您指定要跳出或繼續執行哪個語句,而不是預設情況下隻影響最內層迴圈。

for 迴圈中使用 break 的標籤

#

以下程式碼演示了在帶有 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 == 2j == 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

for 迴圈中使用 continue 的標籤

#

以下程式碼演示了在帶有 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 == 2j == 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

while 迴圈中使用 break 的標籤

#

以下程式碼演示了在帶有 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 == 2j == 2 時,程式會跳出內部和外部 while 迴圈。因此,輸出為:

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

while 迴圈中使用 continue 的標籤

#

以下程式碼演示了在帶有 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 = 2j = 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

do-while 迴圈中使用 break 的標籤

#

以下程式碼演示了在帶有 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 == 2j == 2 時,程式會跳出內部和外部迴圈。因此,輸出為:

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

do-while 迴圈中使用 continue 的標籤

#

以下程式碼演示了在帶有 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 = 2j = 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