Сообщение от рони
|
спасибо, но с последним примером ступор, не понимаю почему 1, 2, 3, 1, 2, 3 ... а не 1, 2, 3, undefined, undefined, undefined ...?
|
Давайте размотаем
цикл!
У нас есть
function* () {
while(true) {
yield* [1, 2, 3];
}
}
мы можем уменьшить цикл на одну итерацию...
function* () {
yield* [1, 2, 3];
while(true) {
yield* [1, 2, 3];
}
}
и ещё...
function* () {
yield* [1, 2, 3];
yield* [1, 2, 3];
while(true) {
yield* [1, 2, 3];
}
}
и ещё...
function* () {
yield* [1, 2, 3];
yield* [1, 2, 3];
yield* [1, 2, 3];
while(true) {
yield* [1, 2, 3];
}
}
и ещё...
function* () {
yield* [1, 2, 3];
yield* [1, 2, 3];
yield* [1, 2, 3];
yield* [1, 2, 3];
while(true) {
yield* [1, 2, 3];
}
}
поскольку это бесконечный цикл, то полностью его невозможно размотать.
UPD
Сообщение от рони
|
уже больше понимания, тут
yield* xs;
yield* cycle(xs);
здесь вопросов нет, но как работет while(true) yield* недопонимаю.
спасибо за обьяснения.
|
Обратите внимание на рекурсию в определении cycle
function* cycle(xs) {
yield* xs;
yield* cycle(xs);
}
можно попытаться раскрыть эту рекурсию...
function* cycle(xs) {
yield* xs;
yield* xs;
yield* cycle(xs);
}
и ещё...
function* cycle(xs) {
yield* xs;
yield* xs;
yield* xs;
yield* cycle(xs);
}
естественно при полном раскрытии (бесконечное кол-во строчек с
yield* xs;) вы никогда не достигнете последнего
yield* cycle(xs);
то можно переписать так...
function* cycle(xs) {
while(true)
yield* xs;
}
Вы понимаете, что это одно и тоже определение, только без рекурсии?
UPD 2 внутри тела функции-генератора...
yield* xs;
означает тоже самое, что
for(const x of xs) yield x;
Сообщение от рони
|
но как работет
while(true) yield* xs;
недопонимаю.
|
т. е. это тоже самое, что
while(true) for(const x of xs) yield x;