0Pricing
Learn Rust Coding · レッスン

アダプターとコンシューマー

操作を連結します

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

2種類のメソッド

イテレータのメソッドは2つのグループに分かれます。

  • アダプターは新しいイテレータを返し、遅延評価されます(map、filter、take)
  • コンシューマはイテレータを実行し、最終的な値を生成します(sum、collect、for_each)

すべてのパイプラインは、0個以上のアダプターに続いて、ちょうど1つのコンシューマで構成されます。

take: 要素数を制限する

take(n)は最大でn個の要素を生成し、その後停止します。アダプターなので、遅延評価のままです。

無限イテレータにも使うことができ、要求した分だけを取り出せます。

fn main() {
    let first_three: Vec<i32> = (1..).take(3).collect();
    println!("{:?}", first_three);
}

skip: 最初の要素を無視する

skip(n)は最初のn個の要素を破棄し、残りを生成します。takeと組み合わせると、途中の範囲を取り出せます。

fn main() {
    let window: Vec<i32> = (1..=10).skip(3).take(4).collect();
    println!("{:?}", window);
}

enumerate: インデックスと組み合わせる

enumerateは、0から数えた(index, value)タプルを生成します。手動でカウンターを用意せずに位置を取得する、慣用的な方法です。

fn main() {
    let letters = vec!['a', 'b', 'c'];
    for (i, c) in letters.iter().enumerate() {
        println!("{} -> {}", i, c);
    }
}

zip: 2つのイテレータを同時に進める

zipは2つのイテレータの要素を組み合わせます。短い方のイテレータの要素が尽きると停止します。

名前と点数のような、並行するデータを組み合わせるときに便利です。

fn main() {
    let names = vec!["Ana", "Ben"];
    let ages = vec![30, 25];
    for (name, age) in names.iter().zip(ages.iter()) {
        println!("{} is {}", name, age);
    }
}

rev: 順序を逆にする

revは要素を後ろから前へ生成します。範囲やスライスが提供する、両端イテレータが必要です。

fn main() {
    let backwards: Vec<i32> = (1..=5).rev().collect();
    println!("{:?}", backwards);
}

chain: 2つのイテレータをつなぐ

chainは最初のイテレータを最後まで実行し、その後2つ目のイテレータを続けて実行します。まるで1つのシーケンスであるかのように扱えます。

fn main() {
    let joined: Vec<i32> = (1..=3).chain(10..=12).collect();
    println!("{:?}", joined);
}

fold: 単一の値を構築する

foldは汎用的なコンシューマです。アキュムレータから開始し、クロージャを使って各要素をそこへ畳み込みます。

sumなど多くのコンシューマは、foldの特殊なケースです。

fn main() {
    let product = (1..=5).fold(1, |acc, x| acc * x);
    println!("5! = {}", product);
}

anyとall: 真偽値を返すコンシューマ

anyは少なくとも1つの要素が述語を満たす場合にtrueを返し、allはすべての要素が満たす場合にだけtrueを返します。

どちらも短絡評価を行い、答えが分かった時点で停止します。

fn main() {
    let nums = vec![2, 4, 6, 7];
    println!("{}", nums.iter().all(|x| x % 2 == 0));
    println!("{}", nums.iter().any(|x| x % 2 != 0));
}

findとposition

findは、述語に一致する最初の要素をOptionとして返します。一方、positionは最初に一致した要素のインデックスを返します。

どちらも最初に一致した時点で短絡評価します。

fn main() {
    let nums = vec![1, 3, 5, 8, 9];
    println!("{:?}", nums.iter().find(|&&x| x % 2 == 0));
    println!("{:?}", nums.iter().position(|&x| x % 2 == 0));
}

パイプラインを設計する

アダプターを積み重ね、最後に1つのコンシューマを置いてパイプラインを構築します。1行に1つの操作を置くと、読みやすくなります。

アダプターは遅延評価されるため、チェーンが長くてもデータ全体を1回走査するだけです。

クイックチェック

アダプターとコンシューマについて確認しましょう。

まとめ

操作のチェーンについて学びました。

  • アダプター(take、skip、enumerate、zip、rev、chain)は遅延評価のままです
  • コンシューマ(fold、any、all、find、position)が処理を完了させます
  • 真偽値を返すコンシューマと検索用コンシューマは短絡評価します
  • すべてのパイプラインは、アダプターの後に1つのコンシューマを置く構成です

よくある質問

「アダプターとコンシューマー」レッスンは無料ですか?

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

「アダプターとコンシューマー」で何を学びますか?

操作を連結します ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

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

「アダプターとコンシューマー」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Iteratorトレイト
  2. map、filter、collect
  3. アダプターとコンシューマー
  4. カスタムイテレーター
← Learn Rust Codingに戻る