アダプターとコンシューマー
操作を連結します
「アダプターとコンシューマー」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Iteratorトレイト
- map、filter、collect
- アダプターとコンシューマー
- カスタムイテレーター