Rust インデックス付きで Vec, イテレータをループ, 走査する方法

Rust インデックス付きで Vec, イテレータをループ, 走査する方法

Rust の Vec をインデックス付きでループする方法

Rust の Vec もしくは イテレーターの要素をループして走査する際、インデックスも一緒にほしい場合があります。その方法をまとめます。

単純に for i in 0..a.len() {} みたいにしてループするのではなく、インデックスと要素のペアセットでループするようにします。

enumerate() を使う

std::iter::Iterator – Rust

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() を使う

std::iter::Iterator – Rust

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() と等価の処理になります。

以上。

Rustカテゴリの最新記事