コレクションの反復処理
forとイテレーター
「コレクションの反復処理」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
forによるループ
forループは、コレクションの各要素を調べる最も簡単な方法です。
fn main() {
let nums = vec![1, 2, 3];
for n in &nums {
println!("{}", n);
}
}範囲のループ
範囲は、反復処理できるシーケンスを生成します。1..5は終端を含まず、1..=5は終端を含みます。
fn main() {
for i in 1..=3 {
println!("i = {}", i);
}
}iterメソッド
.iter()を呼び出すと、各要素への参照を生成するイテレーターが作成されます。イテレーターは消費されるまで遅延評価されます。
fn main() {
let v = vec![10, 20, 30];
let mut it = v.iter();
println!("{:?}", it.next());
println!("{:?}", it.next());
}反復処理の3つの方法
ベクターには3種類の反復処理方法があります:
iter()—&Tを生成します(借用)。iter_mut()—&mut Tを生成します(可変借用)。into_iter()—Tを生成します(所有権を取得)。
fn main() {
let v = vec![1, 2, 3];
for x in v.into_iter() {
println!("owned {}", x);
}
}mapによる変換
mapは各要素にクロージャを適用し、新しいイテレーターを生成します。結果を集めるにはcollectを使います。
fn main() {
let v = vec![1, 2, 3];
let squared: Vec<i32> = v.iter().map(|x| x * x).collect();
println!("{:?}", squared);
}filterによる選択
filterは、クロージャがtrueを返す要素だけを残します。
fn main() {
let v = vec![1, 2, 3, 4, 5];
let odds: Vec<i32> = v.into_iter().filter(|x| x % 2 == 1).collect();
println!("{:?}", odds);
}sumとcountによる集計
消費メソッドは、イテレーターをsum、count、max、minなどの単一の値に集約します。
fn main() {
let v = vec![4, 8, 15, 16];
let total: i32 = v.iter().sum();
let how_many = v.iter().count();
println!("sum {} count {}", total, how_many);
}アダプターのチェーン
イテレーターメソッドは、明確なパイプラインとしてチェーンできます。最終的に消費されるまで、各ステップでストリームを変換します。
fn main() {
let v = vec![1, 2, 3, 4, 5, 6];
let result: i32 = v.iter()
.filter(|x| *x % 2 == 0)
.map(|x| x * 10)
.sum();
println!("{}", result);
}インデックス用のenumerate
enumerateは各要素にインデックスを組み合わせ、(index, value)というタプルを生成します。
fn main() {
let letters = vec!['a', 'b', 'c'];
for (i, ch) in letters.iter().enumerate() {
println!("{}: {}", i, ch);
}
}HashMapの反復処理
イテレーターはマップにも使えます。ループするとキーと値のタプルが生成されます。
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("a", 1);
m.insert("b", 2);
for (k, v) in &m {
println!("{} -> {}", k, v);
}
}forとイテレーターメソッドの比較
通常のforループは、出力などの副作用を行うのに適しています。イテレーターアダプター(map、filter、sum)は、データを新しい値に変換するときに力を発揮します。
fn main() {
let v = vec![2, 4, 6];
let doubled: Vec<i32> = v.iter().map(|x| x * 2).collect();
for x in &doubled {
println!("{}", x);
}
}簡単な確認
イテレーターアダプターの役割を思い出してください。
まとめ
Rustでコレクションを反復処理する方法:
- 単純なループには
for x in &collectionを使います。 iter、iter_mut、into_iterで借用を制御します。- アダプター:
map、filter、enumerate。 - コンシューマー:
collect、sum、count、max。
fn main() {
let prices = vec![10, 25, 40];
let with_tax: Vec<i32> = prices.iter().map(|p| p + p / 5).collect();
let total: i32 = with_tax.iter().sum();
println!("{:?} total {}", with_tax, total);
}よくある質問
「コレクションの反復処理」レッスンは無料ですか?
はい。「コレクションの反復処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「コレクションの反復処理」で何を学びますか?
forとイテレーター ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「コレクションの反復処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ベクター
- Stringと&str
- HashMap
- コレクションの反復処理