Dart Academy · レッスン

sync* による遅延 Iterable とジェネレーター

必要なときに値を生成します

レッスン 3/413 ステップ

「sync* による遅延 Iterable とジェネレーター」はCoddyKit上の無料Dart Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDart Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Dart Academyコースには全4レッスンが含まれています。

lazyとは

lazyなIterableは、実際に要求されるまで値を計算しません。処理は一度にすべて行われず、必要に応じて実行されます。🦥

Iterableはlazyである

mapやwhereなどのメソッドは、lazyなIterableを返します。反復処理するかtoListを呼び出すまで、何も実行されません。

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

まだ何も実行されない

そのIterableを消費するまで、mapの本体は実行されません。lazyであれば、処理を記述してcostを後回しにできます。

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

lazyが役立つ理由

必要な結果が少しだけなら、lazyによって無駄な処理を省けます。takeと組み合わせれば、早い段階で停止して残りを飛ばせます。

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

sync*ジェネレーター

sync*関数は、lazyなIterableを構築するジェネレーターです。要求されるたびに、値を1つずつ生成します。

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

yieldキーワード

ジェネレーター内では、yieldによって値を1つ呼び出し側に返し、次の値が必要になるまで一時停止します。

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

無限シーケンス

値はlazyに生成されるため、有限個の範囲だけを取得する限り、ジェネレーターでinfiniteなシーケンスも安全に表現できます。

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

有限範囲を取得する

無限ジェネレーターとtakeを組み合わせて、必要な分だけ取得します。範囲が埋まった瞬間にループは停止します。

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

yield*で委譲する

yield*を使うと、別のIterableまたはジェネレーターのすべての値を生成できます。1つのシーケンスを現在のシーケンスに平坦化します。

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

ジェネレーターとリスト構築の違い

ジェネレーターを使えば、完全なリストをメモリ上に構築せずに済みます。値をストリームとして扱うため、大規模なシーケンスや終わりのないシーケンスでもmemory-lightに保てます。

sync*とasync*の違い

同期的なlazy Iterableにはsync*を使います。非同期版のasync*は、非同期イベントのシーケンスを扱うStreamを生成します。

クイックチェック

ジェネレーターについての理解度を確認しましょう。

まとめ

Iterableはlazyであり、sync*ジェネレーターは要求に応じて値を生成します。これにより、無限シーケンスさえ低コストでモデル化できます。🌟

無料で開始

AI チューターと学ぶ Dart — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「sync* による遅延 Iterable とジェネレーター」レッスンは無料ですか?

はい。「sync* による遅延 Iterable とジェネレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Dart Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Dart Academyコースには全4レッスンが含まれています。

「sync* による遅延 Iterable とジェネレーター」で何を学びますか?

必要なときに値を生成します ブラウザで直接実行するハンズオンコードでDart Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Dart Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDart Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「sync* による遅延 Iterable とジェネレーター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDart Academyレッスンでコードを書いて実行できますか?

はい。すべてのDart Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 高階関数とカリー化
  2. fold、reduce、expand
  3. sync* による遅延 Iterable とジェネレーター
  4. 純粋関数パイプラインの合成
← Dart Academyに戻る