Próbuję napisać program równomiernie (lub tak blisko jak to możliwe) rozprowadzać punkty o powierzchni kuli. Próbuję to osiągnąć, umieszczając N punktów losowo wokół sfery jednostki, a następnie wykonując wiele kroków, w których punkty odpychają się nawzajem.Mutowanie elementu wewnątrz zagnieżdżonych pętli
Problem występuje w pętli nad tablicą punktów. Kod poniżej pętli nad każdym punktem, a następnie pętli w środku, ponownie pętli nad każdym punktem i oblicza siłę odpychającą między każdą parę punktów.
for point in points.iter_mut() {
point.movement = Quaternion::identity();
for neighbour in &points {
if neighbour.id == point.id {
continue;
}
let angle = point.pos.angle(&neighbour.pos);
let axis = point.pos.cross(&neighbour.pos);
let force = -(1.0/(angle*angle)) * update_amt;
point.movement = point.movement * Quaternion::angle_axis(angle, axis);
}
}
Dostaję błąd:
src/main.rs:71:27: 71:33 error: cannot borrow `points` as immutable because it is also borrowed as mutable
src/main.rs:71 for neighbour in &points {
i wyjaśnienie
the mutable borrow prevents subsequent moves, borrows, or modification of `points` until the borrow ends
Jestem całkiem nowy, Rust, pochodzących z C++ tle, a ja mam nie wiem, jak wykonać ten wzór w Rust.
Wszelkie rozwiązania tego problemu byłyby bardzo doceniane, ponieważ jestem absolutnie utknięty dla pomysłów. Dzięki.
Edit:
mam wypracowane rozwiązanie, które zostały wyszczególnione w poniższej odpowiedzi. Nadal nie wiem, czy to najlepszy sposób na rozwiązanie problemu, więc nadal jestem otwarty na sugestie.
'points.iter_mut()' może być napisane 'i mut points'. –
Z pewnością podstawowa idea, którą chcesz osiągnąć, nie może być wykonana w bezpiecznym kodzie rdzy; rzeczy do odczytu i zapisu będą musiały być w jakiś sposób oddzielone, aby można je było wyrazić w bezpiecznym kodzie. –