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