跳到主要内容

循环

本页面展示了如何使用循环和相关语句来控制 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