本页展示了如何使用循环和支持语句来控制 Dart 代码的流程:
- for 循环
- while 和 do while 循环
- break 和 continue
您还可以使用以下方法操纵 Dart 中的控制流:
- 分支,如 if 和 switch
- 例外,例如 try 、 catch 和 throw
For 循环
您可以使用标准 for 循环进行迭代。例如:
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
Dart 的 for 循环内部的闭包捕获索引的值。这避免了 JavaScript 中常见的陷阱。例如,考虑:
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 类型(例如 List 或 Set )时,您可能不需要知道当前迭代计数器。在这种情况下,请使用 for-in 循环来获得更简洁的代码:
for (final candidate in candidates) {
candidate.interview();
}
要处理从 iterable 获取的值,您还可以在 for-in 循环中使用模式:
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name has $yearsExperience of experience.');
}
要练习使用 for-in ,请遵循可迭代集合 Codelab。
可迭代类还有一个 forEach() 方法作为另一个选项:
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3
while 和 do-while
while 循环评估循环之前的条件:
while (!isDone()) {
doSomething();
}
do - while 循环评估循环后的条件:
do {
printLine();
} while (!atEndOfPage());
中断并继续
使用 break 停止循环:
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
使用 continue 跳到下一个循环迭代:
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
如果您使用 Iterable (例如列表或集合),则编写前面示例的方式可能会有所不同:
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());