Как идиоматически перебирать изменяемый вектор при проверке других элементов

#rust

#Ржавчина

Вопрос:

Я хочу написать такой код:

 let mut v: Vec<Object> = Vec::new();
for e in v.iter_mut() {
  if e.some_predicate() {
    e.val = v.iter().filter(|o| o.some_predicate()).count();
  }
}
 

Это не работает, потому что цикл for принимает изменяемое заимствование, а затем iter пытается выполнить неизменяемое заимствование. Я понимаю, почему программе проверки заимствования не нравятся создаваемые конкретные типы, но операция, которую я пытаюсь выполнить, кажется безопасной, и если я перепишу ее для использования индексов, она будет работать нормально:

 let mut v: Vec<Object> = Vec::new();
for i in 0..v.len() {
  if v[i].some_predicate() {
    v[i].val = v.iter().filter(|o| o.some_predicate()).count();
  }
}
 

Какой идиоматический способ сделать это в rust?

Комментарии:

1. В данном конкретном случае я бы сказал, что использование индексов — это идиоматический способ его написания.

2. Ответ вполне может быть тем, что сказал @user4815162342. Может быть «лучший» ответ, но это будет зависеть от того, каковы именно предикаты.