Geo*_*ins 6 javascript iterator iterable generator
为什么生成器同时是可迭代器和迭代器是有用/必要的?
我认为可迭代和迭代器是完全不同的,例如集合是可迭代的,这意味着我可以在它上面请求一个迭代器,每次这样做我都会得到一个新的迭代器,它允许我单步遍历整个集合一次。
生成器看起来最像一个迭代器,即一旦你无法用它做任何事情,那么一旦你单步遍历它的元素,但除了实现next()它之外,还实现了 iterable 的 get-iterator 逻辑,但仅此逻辑返回发电机本身:
$ node
> const genFn = function* () { yield *[1, 2, 3]; }
> const gen = genFn();
> gen.next();
{ value: 1, done: false }
> gen == gen[Symbol.iterator]();
true
> for (const val of gen) console.log(val);
2
3
Run Code Online (Sandbox Code Playgroud)
为什么生成器除了是迭代器之外还必须是可迭代的?
因为它允许解释器在需要时无条件地请求一个“新”迭代器,而不必担心可迭代对象是否已经是一个迭代器。编写用于实现循环的代码非常容易,for/of该循环在设置过程中无条件调用.iterator它接收到的所有内容,而不是让每次迭代启动都执行类型检查以查看它接收到的内容是否已经是迭代器,并且只是有条件地进行称呼.iterator。
Python 使用相同的迭代器协议;所有迭代器都是可迭代的,其等效的“getiterator”方法被定义为恒等函数。
从逻辑上来说也是有道理的。“Iterable”的意思是“能够被迭代”(涵盖迭代器和可以创建迭代器的东西)。迭代器的概念是可迭代事物概念的超集,因此它们需要提供可迭代接口。
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |