Мне нужно перебрать поле структуры внутри Rc RefCell и изменить некоторые из его аргументов в соответствии с другим полем. Например, для структуры Foo:
pub struct Foo {
pub foo1: Vec<bool>,
pub foo2: Vec<i32>,
}
Следующий код вызывает панику:
fn main() {
let foo_cell = Rc::new(RefCell::new(Foo { foo1: vec![true, false], foo2: vec![1, 2] }));
foo_cell.borrow_mut().foo2.iter_mut().enumerate().for_each(|(idx, foo2)| {
if foo_cell.borrow().foo1[idx] {
*foo2 *= -1;
}
});
}
Я могу решить эту проблему, клонируя foo1 перед изменяемым заимствованием и просто используя клон внутри замыкания, но это приводит к ненужному копированию. На самом деле мне в основном нужна одна изменяемая ссылка на foo2 и одна неизменяемая ссылка на foo1 (обратите внимание, что это упрощенный код, и здесь не работает сжатие итераторов). Я понимаю, что код не соответствует правилам заимствования. Есть ли способ заставить это работать без клонирования данных?