let my_vec = (0..25).collect::<Vec<_>>()
があり、my_vec
を10個のグループのイテレータに分割したいと思います。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
[20, 21, 22, 23, 24, None, None, None, None, None];
Rustのイテレータでそれを行うことは可能ですか?
Iterator
trait に直接そのようなヘルパーメソッドはありません。ただし、これを行うには主に2つの方法があります。
[T]::chunks()
メソッド (_Vec<T>
_で直接呼び出すことができます)を使用します。ただし、わずかな違いがあります。None
は生成されませんが、最後の反復ではより小さなスライスが生成されます。
例 :
_let my_vec = (0..25).collect::<Vec<_>>();
for chunk in my_vec.chunks(10) {
println!("{:02?}", chunk);
}
_
結果:
_[00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
_
Itertools::chunks()
メソッド from crate itertools
を使用します=。このクレートは、標準ライブラリのIterator
特性を拡張します。したがって、このchunks()
メソッドはすべてのイテレータで機能します!その一般的なものにするために、使用法は少し複雑であることに注意してください。これは、上記の方法と同じ動作をします。最後の反復では、チャンクはNone
sを含む代わりに小さくなります。
例 :
_extern crate itertools;
use itertools::Itertools;
for chunk in &(0..25).chunks(10) {
println!("{:02?}", chunk.collect::<Vec<_>>());
}
_
結果:
_[00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
_
また、次の点にも注意してください。
vec![0..25]
_はあなたが期待することをしていません! one要素を持つベクトルを作成します。その要素は Range
です。上記の例でこれを修正しました。snake_case
_の名前が付いています。