Что выведет код Middle Функции, замыкания, генераторы обновлено

Ключи генератора и yield from

Вопрос

Что выведет скрипт (PHP 8.3)? По строке на каждый вывод.

<?php
function inner() {
    yield 1;
    yield 2;
    return 3;
}
function outer() {
    yield 0;
    $r = yield from inner();
    yield $r;
}
foreach (outer() as $k => $v) {
    echo "$k:$v ";
}
echo "\n";
echo json_encode(iterator_to_array(outer(), false)), "\n";
echo json_encode(iterator_to_array(outer())), "\n";

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 0:0 0:1 1:2 1:3, [0,1,2,3], [1,3]. yield from не перенумеровывает ключи: внутренний генератор отдаёт свои ключи 0 и 1, а внешний продолжает свой счёт, поэтому ключи повторяются: 0:0 0:1 1:2 1:3.

Что выведет

0:0 0:1 1:2 1:3
[0,1,2,3]
[1,3]

Разбор

yield from не перенумеровывает ключи: внутренний генератор отдаёт свои ключи 0 и 1, а внешний продолжает свой счёт, поэтому ключи повторяются: 0:0 0:1 1:2 1:3. Значение $r это return вложенного генератора, 3. iterator_to_array(..., false) игнорирует ключи и собирает все 4 значения. С ключами (по умолчанию) повторяющиеся ключи перезаписываются: под 0 остаётся 1, под 1 остаётся 3, итог [1,3]. Отсюда правило: с yield from вызывайте iterator_to_array с false.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.