fn main() {
let v = vec![0,1,2,3];
for i in v {
println!{"{:?}", i}
}
}
vectorの要素が順に出力される。
これを見て、「このようにかけるということはvectorはiteratorなのだろうか。」という疑問が湧いた。
stackoverflowに投稿された同様の疑問。
In Rust, is a vector an Iterator?
forループとcollectionとiterator
forループとは、collectionの要素を順に処理できるものである。(Looping Through a Collection with for)
このときcollectionはiterable、すなわち要素を順に処理することとができるものでなければならない。
Trait std::iter::Iterator
forループはiteratorのシンタックスシュガー(Rust doc/ for Loops and IntoIterator)
collectionとは複数の値を持つ構造体のこと。(Common Collections)
そして、Vectorはcollectionであり、iterableである。
ただし、iterableなだけでiteratorではない。(という理解でいいのかな)
forループがVectorにすること
VectorはIntoIteratorトレイトを実装している(Rust doc)。
Vectorをforループに渡すと、forループはIntoIterator::into_iterを呼び、Vectorをiteratorとしてループする(Rust doc/ for Loops and IntoIterator)
forループのinにVectorをそのまま渡してもループできるのはこのため。
into_iter
次のコードはコンパイルされない。
vは最初のforループでmoveされるため、2つ目のforループでは使えない。
fn main() {
let v = vec![0,1,2,3];
for i in v {
println!{"{:?}", i}
}
for i in v {
println!{"{:?}", i}
}
}
// => use of moved value: `v`
参照を渡すかiter
メソッドを呼んで渡す必要がある。
fn main() {
let v = vec![0,1,2,3];
for i in &v {
println!{"{:?}", i}
}
for i in v {
println!{"{:?}", i}
}
}