Вызов yield(something)
в sequence
означает iterator of the Sequence
hasNext()
, и вы получите something
при вызове next()
.
После того, как пользователь итератора вызовет next()
, а затем hasNext()
снова, выполнение возобновится с yield
.
Это выглядит бессмысленно, когда он просто дает 1 2 3. Но рассмотрите возможность обхода двоичного дерева. Предварительный заказ, заказ или пост-заказ очень легко написать в рекурсивном коде. Мы можем использовать стек вызовов, чтобы запомнить, что делать дальше.
Когда мы хотим создать итератор, мы теряем все эти хорошие вещи. Мы должны использовать явный стек, чтобы запомнить, какие узлы следует посетить дальше - если только мы не используем функцию sequence
.
та же самая дополнительная проблема является примером такой силы.
Я не согласен с другим ответом о том, что «это не функция сопрограммы». Возможность возобновления в середине выполнения - это определение подпрограмм co . Сравните это с подпрограммами sub , которые должны запускаться с самого начала.
Мы очень часто используем «сопрограммы» для ссылки на конструкции параллелизма в Kotlin. Построение последовательности не является частью этого, но все еще является примером сопрограмм.