为什么迭代协议要分为可迭代协议和迭代器协议?
迭代协议分为可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)的设计源于对职责分离和接口统一性的考量。这种分层机制为不同数据结构提供了灵活的迭代支持,同时确保了语言内部遍历逻辑的统一性。以下是具体原因解析:
一、职责分离:解耦迭代能力与迭代过程
- 可迭代协议的作用:可迭代协议要求对象实现
[Symbol.iterator]()
方法(JavaScript)或__iter__
方法(Python),其核心是声明对象是否可被迭代。例如,JavaScript中的数组、字符串等内置类型原生支持该协议,而普通对象则需要手动实现。
示例:
const obj = {
[Symbol.iterator]() { return 迭代器对象 }
};
- 迭代器协议的作用:迭代器协议定义了如何产生值序列,要求对象必须包含
next()
方法。该方法返回{ value: any, done: boolean }
对象,具体控制遍历的每一步逻辑。
示例:
const iterator = {
next() { /* 返回下一项或终止 */ }
};
分离的意义:通过将“能否迭代”与“如何迭代”解耦,允许数据结构仅关注自身是否可遍历(可迭代协议),而将具体的遍历逻辑(如指针移动、状态管理)交给独立的迭代器对象(迭代器协议)。