Rustで2重ループをIteratorのみで行う方法はありますか?
三角形状に1次元の配列をループし、全ての組み合わせに対して処理を行いたい場合、Javaでは以下のような物になると思います
Foo[] data = ...;
for(int i = 0; i < data.length(); i++) {
for(int j = i + 1; j < data.length(); j++) {
//いろいろdata[i]やdata[j]を使って計算
data[i].bar += ...;
data[j].bar += ...;
}
}
これをRustでIteratorのみでやる方法はあるのでしょうか?
以下のように内部ループで元のiter
を変えないようにコピーを作れれば(元のデータはコピーせず参照)と考えていたのですが、それらしき関数が見当たらなかったので
let mut data: Vec<Foo> = ...;
let mut iter = data.iter_mut();
while let Some(idata) = iter.next() {
//内部ループでは外部ループで使う`iter`を消費しないようにしたい
let mut inner_iter = iter.clone();
for jdata in inner_iter {
//いろいろidataやjdataを使って計算
idata.bar += ...;
jdata.bar += ...;
}
}