基本概念
在 Dart 里:
- Iterable:可以被遍历的集合(List、Set、生成器
sync*
返回值等) - Iterator:负责一次一次取出元素的工具对象
Iterable → iterator → moveNext() & current
Iterable.iterator
会返回一个 迭代器对象(Iterator<T>
)- 迭代器内部维护一个当前位置(刚开始在第一个元素前面)
- 通过
moveNext()
移动到下一个元素,并返回是否还有元素 - 通过
current
读取当前元素
基本流程
获取迭代器:迭代器的位置现在还在第一个元素之前。
var it = someIterable.iterator;
移动到下一个元素:
bool hasMore = it.moveNext();
- 如果有下一个元素 → 返回
true
,位置指向该元素 - 如果没有 → 返回
false
(到头了)
获取当前元素:
var value = it.current;
current
只是取当前位置的值- 如果不先
moveNext()
,current
的值是无效的
示例运行
void main() {
// numbers 是一个 List<int>,属于 Iterable<int>
// Iterable 是一个可以被迭代的集合类型
// 它可以是 List、Set 等类型
var numbers = [10, 20, 30];
// 使用迭代器来遍历 Iterable
// numbers.iterator 返回一个迭代器
// 迭代器是一个对象,它可以逐个访问集合中的元素
var it = numbers.iterator;
// moveNext() 方法会移动到下一个元素
// 如果有下一个元素,返回 true;如果没有下一个元素,返回 false
while (it.moveNext()) {
// current 属性返回当前元素
// 注意:在调用 moveNext() 之前,current 是无效的
// 所以必须先调用 moveNext(),然后才能访问 current
// 这里的 it.current 是迭代器的当前元素
print('当前元素: ${it.current}');
}
}
运行过程:
1️⃣ moveNext() → true,current = 10
2️⃣ moveNext() → true,current = 20
3️⃣ moveNext() → true,current = 30
4️⃣ moveNext() → false,循环结束
输出:
当前元素: 10
当前元素: 20
当前元素: 30
为什么要用这种方式
更精细控制:可以中途暂停、跳过元素、倒退(配合自定义迭代器)
for-in 循环的底层机制:for (var x in iterable)
就是自动帮你调用 iterator.moveNext()
和 iterator.current
适合需要“边迭代边做复杂控制”的场景
var it = data.iterator;
while (it.moveNext()) {
if (it.current < 0) break; // 提前结束
print(it.current);
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com