VectorをIteratorに変換する時にいつも混乱していたので整理した。
混乱
あるVectorの要素すべてを3倍するコードを考える。
fn main() { let vec1 = vec![1,2,3,4,5]; let vec2 = vec1.iter() .map(|i| i * 3) .collect::<Vec<i32>>(); println!("{:?}", vec1); println!("{:?}", vec2); }
このコードはコンパイルできるが、以下のような疑問がある。
- 5行目で
vec1
はなぜ使えるのか? 3行目のvec1.iter()
で使われているじゃないか! map(|i| i * 3)
のi
は参照なのか値なのか?
これらの疑問に関する答えは、
iter()
はVectorをmoveしない。into_iter()
はVectorをmoveする。iter()
はVectorから「参照のコレクションであるIterator」を作成し、into_iter()
はVectorから「値のコレクションであるIterator」を作成する。
ということになる。
続きを読む