0Pricing
Dart Academy · Урок

Ленивые итерируемые объекты и генераторы с sync*

Создавайте значения по требованию

«Ленивые итерируемые объекты и генераторы с sync*» — бесплатный урок Dart Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.

Что означает ленивый

Ленивая итерируемая последовательность не вычисляет значения, пока Вы действительно их не запросите. Работа выполняется по требованию, а не сразу целиком. 🦥

Итерируемые последовательности ленивы

Такие методы, как map и where, возвращают ленивый Iterable. Ничего не выполняется, пока Вы не начнёте перебор или не вызовете toList.

var it = [1, 2, 3].map((n) {
  print('seen $n');
  return n * 2;
});

Пока ничего не выполняется

Пока Вы не используете эту итерируемую последовательность, тело map не выполняется. Ленивость позволяет описать работу и отложить затраты.

for (var x in it) print(x); // now it runs

Преимущества ленивости

Ленивость экономит работу, когда Вам нужны лишь несколько результатов. Вместе с take она позволяет остановиться раньше и пропустить остальные элементы.

var first2 = it.take(2).toList();

Знакомство с генераторами sync*

Функция синхронного генератора создаёт ленивый Iterable. Она выдаёт значения по одному, по мере запроса.

Iterable<int> count(int n) sync* {
  for (var i = 1; i <= n; i++) yield i;
}

Ключевое слово yield

Внутри генератора выдача значения передаёт одно значение вызывающему коду и приостанавливается, пока не понадобится следующее.

print(count(3).toList()); // [1, 2, 3]

Бесконечные последовательности

Благодаря ленивой выдаче генератор может безопасно описывать бесконечную последовательность, если Вы берёте только конечный фрагмент.

Iterable<int> naturals() sync* {
  var i = 0;
  while (true) yield ++i;
}

Получение конечного фрагмента

Объедините бесконечный генератор с take, чтобы получить только нужные значения. Цикл остановится сразу после заполнения фрагмента.

print(naturals().take(5).toList()); // [1, 2, 3, 4, 5]

Делегирование выдачи значений

Используйте делегирование выдачи, чтобы выдать все значения другой итерируемой последовательности или генератора. Это добавляет одну последовательность к текущей.

Iterable<int> both() sync* {
  yield* count(2);
  yield* count(2);
}

Генераторы и создание списков

Генератор не создаёт полный список в памяти. Значения передаются потоком, поэтому большие или бесконечные последовательности требуют минимум памяти.

Синхронные и асинхронные генераторы

Используйте синхронные генераторы для синхронных ленивых итерируемых последовательностей. Их асинхронный аналог создаёт поток Stream для асинхронных последовательностей событий.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли генераторы.

Итоги

Итерируемые последовательности ленивы, а синхронные генераторы выдают значения по требованию. Это позволяет недорого моделировать даже бесконечные последовательности. 🌟

Часто задаваемые вопросы

Урок «Ленивые итерируемые объекты и генераторы с sync*» бесплатный?

Да — полный текст урока «Ленивые итерируемые объекты и генераторы с sync*» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ленивые итерируемые объекты и генераторы с sync*»?

Создавайте значения по требованию Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Dart Academy?

Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Ленивые итерируемые объекты и генераторы с sync*»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Dart Academy?

Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Функции высшего порядка и каррирование
  2. fold, reduce и expand
  3. Ленивые итерируемые объекты и генераторы с sync*
  4. Композиция конвейеров чистых функций
← Назад к Dart Academy