イテレーターチェインと遅延評価(@Rust)

Beginning Rustのコードから、

以下のようなイテレーターを返す関数(イテレーターアダプタとイテレータコンシューマ)をチェインして、最後にcollectコンシューマというのは、Rustではイテレーターチェインと呼ばれる構造になりますが、同時に遅延評価(lazy evaluation)もなされます。遅延評価とはコンシューマが要求しない限りは結果を出さない、つまり使われない結果を出すというのは無駄なことだろうから。

fn main() {
    let v = [66, -8, 43, 19, 0, -31]
        .into_iter()
        .filter(|x| { print!("F{} ", x); *x > 0 })
        .map(|x| { print!("M{} ", x); x * 2 })
        .collect::<Vec<_>>();
    print!("{:?}", v);
}

実行結果は、

F66 M66 F-8 F43 M43 F19 M19 F0 F-31 [132, 86, 38]

実質ループ処理になっていて、collectコンシューマがループ処理を受け持っていることになります、このコードをfor loopで書き直すと、

fn main() {
    let mut v = vec![];
    for item in [66, -8, 43, 19, 0, -31]
        .into_iter()
        .filter(|x| { print!("F{} ", x); *x > 0 })
        .map(|x| { print!("M{} ", x); x * 2 }) {
        v.push(item);
    }
    print!("{:?}", v);
}

このコードでは、vは変更されるのでmutになってますが、先のコードでvはmutである必要はありません。なぜなら作成されるだけで、書き換えはしないから。

 

admin

カテゴリーRust