我很难调和这两个:
const gen = function *() {
yield 3;
yield 4;
return 5;
};
const rator = gen();
console.log(rator.next()); // { value: 3, done: false }
console.log(rator.next()); // { value: 4, done: false }
console.log(rator.next()); // { value: 5, done: true }
上面我们看到了所有3个值,如果我们第四次调用next(),则会得到:
{ value: undefined, done: true }
这很有意义。但是现在,如果我们在循环中使用它:
for(let v of gen()){
console.log('next:', v); // next: 3, next: 4
}
我想我感到困惑,为什么使用for循环不打印next: 5
,但是在迭代器上手动调用next()可以得到return
的值。谁能解释这是为什么?
换句话说,我希望for loop
打印next: 5
,但不会打印。
答案 0 :(得分:0)
为了保持一致性,这似乎行得通吗?
const gen = function *() {
yield 3;
yield 4;
return yield 5;
};
return
关键字现在似乎什么也没做。
答案 1 :(得分:0)
返回的值包含在exception.value
中,其中exception
是生成器实例返回时生成器实例抛出的StopIteration。
示例:
def generator_function():
yield 0
yield 1
return "text"
value_list = []
exception_list = []
try:
a = generator_function()
while True:
value_list.append(next(a))
except StopIteration as e:
exception_list.append(e)
print(value_list)
print(exception_list)
print(type(exception_list[0]), exception_list[0])
print(type(exception_list[0].value), exception_list[0].value)