Rust イテレータとは 使い方と注意点について
今回はRustにおけるイテレータについて説明していきます。
イテレータとは
イテレータはコレクションの要素を順に処理するためのツールです。
イテレータはアイテムを一つずつ順番に処理するためのインターフェースを提供し、多くの便利なメソッドを備えています。
RustのイテレータはIteratorトレイトを実装します。
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
// 省略された他のメソッド
}
イテレータの使い方
Vecなどの標準コレクションはイテレータを提供しています。
例えばベクタのイテレータを取得して要素を順に処理するには以下のように書きます。
fn main() {
let vec = vec![1, 2, 3, 4, 5];
let mut iter = vec.iter();
while let Some(item) = iter.next() {
println!("{}", item);
}
}
vec.iter()によってベクタのイテレータが作成されiter.next()によって次の要素が順に取得されます。
イテレータには多くの便利なメソッドがあり、それらを組み合わせてチェインすることができます。例えば、map、filter、collectなどのメソッドを使うことができます。
fn main() {
let vec = vec![1, 2, 3, 4, 5];
let result: Vec<i32> = vec.iter()
.map(|x| x * 2)
.filter(|x| x > &5)
.collect();
println!("{:?}", result); // [6, 8, 10]
}
mapメソッドで要素を2倍にし、filterメソッドで5より大きい要素を選択し、collectメソッドで結果をベクタに収集しています。
独自のイテレータを実装することもできます。
struct Counter {
count: u32,
}
impl Counter {
fn new() -> Counter {
Counter { count: 0 }
}
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
self.count += 1;
if self.count <= 5 {
Some(self.count)
} else {
None
}
}
}
fn main() {
let mut counter = Counter::new();
while let Some(num) = counter.next() {
println!("{}", num);
}
}
Counter構造体を定義し、Iteratorトレイトを実装することで、1から5までの数値を生成するカスタムイテレータを作成しています。
イテレータの注意点
所有権と借用
イテレータは所有権と借用のルールを遵守します。
特にiterメソッドは不変参照を返し、iter_mutメソッドは可変参照を返します。また、into_iterメソッドは所有権を奪います。
ライフタイム
イテレータはライフタイムを持つことがあり、特にクロージャや他の参照を含む場合には注意が必要です。
Rustをもっと詳しくなりたい方に
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。
Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。
基礎から学ぶRustプログラミング入門
本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。