#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. Может быть «лучший» ответ, но это будет зависеть от того, каковы именно предикаты.