Rust の Vec をインデックス付きでループする方法
Rust の Vec もしくは イテレーターの要素をループして走査する際、インデックスも一緒にほしい場合があります。その方法をまとめます。
単純に for i in 0..a.len() {}
みたいにしてループするのではなく、インデックスと要素のペアセットでループするようにします。
enumerate() を使う
enumerate()
はイテレーターが返す要素と現在のインデックスのペアを生成して返します。インデックスは usize
型になります。
let a = ['a', 'b', 'c'];
for (i, val) in a.iter().enumerate() {
println!("{}: {}", i, val);
}
// 0: a
// 1: b
// 2: c
インデックスの型を usize
以外で受け取りたい場合は zip()
を使います。
zip() を使う
zip()
は複数のイテレーターを反復し、そのペアセットからなる新しいイテレーターを生成します。0..
をインデックスのイテレーターとすることでインデックスと要素をループできます。
インデックスを usize
以外の型、例えば i32
にしたい場合は以下のようにします。
let a = ['a', 'b', 'c'];
for (i, val) in (0_i32..).zip(a.iter()) {
println!("{}: {}", i, val);
}
// 0: a
// 1: b
// 2: c
インデックスの型以外については enumerate()
と等価の処理になります。
以上。
コメントを書く