15章イテレータ

長い長い1日が終わったんだ†1

−Phil

[†1] 訳注:主人公が同じ1日を繰り返すループものの映画『Groundhog Day』(1993、邦題『恋はデジャ・ブ』)のラストシーンで、ループからようやく抜け出した主人公のセリフ。

イテレータ(iterator)は値の列を生成する値で、典型的には生成した値にループ処理を行うために用いる。Rustの標準ライブラリには、ベクタ、文字列、ハッシュテーブルなどのコレクションから、要素を取り出して処理するイテレータが用意されている。それだけではない。入力ストリームからテキストを1行ずつ取り出すもの、ネットワークサーバからの接続を作るもの、他のスレッドから通信チャネル経由で受け取った値の列を作るものなどもある。もちろん、自分で目的に合わせて実装することもできる。Rustのforループは、イテレータにとって自然な構文になっているが、イテレータ自身にもさまざまなメソッドがあり、マップしたり、フィルタしたり、結合したり、値を集めたりすることができる。

Rustのイテレータは柔軟で、表現力が高く、しかも効率が良い。次の関数を考えてみよう。この関数はn個の最初の正の整数を足し合わせたものを返す(n番目の三角数と呼ばれる)。

fn triangle(n: i32) -> i32 {
    let mut sum = 0;
    for i in 1..=n {
        sum += i;
    }
    sum
}

1..=nRangeInclusive<i32>の値だ。RangeInclusive<i32>は、最初の値(含まれる)から最後の値(含まれる)までの整数を返すイテレータなので、これをforループに与えて、1からnまでの和を求めるのに使うことができる。 ...

Get プログラミングRust 第2版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.