Показать сообщение отдельно
  #13 (permalink)  
Старый 23.04.2019, 17:09
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от рони
спасибо, но с последним примером ступор, не понимаю почему 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;

Последний раз редактировалось Malleys, 23.04.2019 в 17:34.
Ответить с цитированием