学习 Dart 循环流程,与聚合类型相伴
在编程的大海中,循环如同航行的罗盘,指引着我们穿越复杂的代码世界。循环语句为我们提供了一种能够根据条件不断执行循环体的机制,它是算法和数据结构的基石。从宏观角度看,程序运行完毕就会终止,因此几乎所有的软件都需要一个循环来保持运行。从微观视角看,一切的遍历操作都依赖循环流程。在 Dart 编程中,循环的主要形式是 for
循环和 while
循环。
标准 for
循环
标准的 for
循环具有简明的结构,括号内有三个部分,由分号分隔。startExp
是进入循环体前执行的表达式,仅在循环开始时执行一次;condition
是一个 bool
类型的条件,作为循环的“阀门”,只有在为 true
时允许执行循环体;eachLoopExp
在每次循环体结束后触发,通常用于修改 condition
的条件。
for (startExp; condition; eachLoopExp) {
loopBody
}
让我们通过一个例子来感受一下,对于 List
来说,遍历访问其中的元素是非常常见的操作。下面的示例展示了通过标准 for
循环遍历输出列表元素的过程:
List cnNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
for (int i = 0; i < cnNumUnits.length; i++) {
print(cnNumUnits[i]);
}
在上面的代码中,首先在进入循环体之前,会执行 int i = 0
来初始化局部变量 i
。然后判断 i < cnNumUnits.length
是否成立,如果成立则执行循环体,否则循环终止。在循环体执行完毕后,会触发 i++
表达式,递增 i
,然后再次判断 i < cnNumUnits.length
是否成立。可以看出,eachLoopExp
的作用是控制循环流程的终止条件。
我们可以将上述结构拆解开来,等效于如下代码。尽管不推荐这种写法,但通过这样的变形,你会更深刻地理解 for
循环的三个部分,而不仅仅是机械地记住结构。
cnNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
int i = 0;
bool condition = i < cnNumUnits.length;
for (; condition; ) {
print(cnNumUnits[i]);
i++;
condition = i < cnNumUnits.length;
}
正如我在前面所说,对于初学者来说,循环的逻辑可能会稍显复杂。但是不要紧,随着你的不断接触和实践,这种感觉会渐渐变得熟悉,逐渐地,你会更加理解循环的本质。
for...in
循环
事实上,for...in
循环只是列表遍历的一种简写形式,它隐藏了循环三部分的细节,直接遍历访问元素。这在某些情况下很方便,但它也没有直接访问索引的能力。根据具体情况,你可以选择使用 for...in
或者 for
循环。
cnNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
for (String element in cnNumUnits) {
print(element);
}
关于遍历中的 forEach
方法,虽然也是一种遍历方式,但它是类方法的一部分,而我们目前主要关注语法级的内容。从源码来看,forEach
实际上也是使用 for...in
实现的,没有太多需要讲解的。
while
循环
另一种常见的循环形式是 while
循环,它在满足条件的情况下不断执行循环体。与 for
循环不同,while
循环只需要一个条件表达式,没有初始值和递增表达式。因此,它更适合在循环体执行前进行条件判断,或者在不确定循环次数的情况下使用。
int count = 0;
while (count < 5) {
print('Count: $count');
count++;
}
在上述代码中,循环会在 count
小于 5 的条件下一直执行。每次循环体执行完毕,count
会递增,直到 count
不再满足小于 5 的条件,循环终止。
do...while
循环
do...while
循环与 while
循环相似,区别在于 do...while
循环会先执行一次循环体,然后再进行条件判断。这意味着 do...while
循环至少会执行一次循环体,而 while
循环可能一次都不执行。
int num = 1;
do {
print('Number: $num');
num++;
} while (num